Lëshimi i paketës së përpiluesit GCC 10

Pas një viti zhvillimi botuar lëshimi i një grupi kompajlerësh falas GCC 10.1, versioni i parë i madh në degën e re të GCC 10.x. Në përputhje me skemë e re numrat e lëshimit, versioni 10.0 u përdor në procesin e zhvillimit dhe pak para lëshimit të GCC 10.1, dega GCC 11.0 tashmë ishte degëzuar, mbi bazën e së cilës do të formohej versioni tjetër i rëndësishëm, GCC 11.1.

GCC 10.1 shquhet për zbatimin e shumë risive në gjuhën C++ të zhvilluara për standardin C++20, përmirësime në lidhje me standardin e ardhshëm të gjuhës C (C2x), optimizime të reja në bazën e përpiluesit dhe mbështetje eksperimentale. mënyra e analizës statike. Për më tepër, gjatë përgatitjes së një dege të re, projekti transferoi depon nga SVN në Git.

Kryesore Ndryshimet:

  • Shtuar mënyra eksperimentale e analizës statike "-fanalizues“, i cili kryen analiza ndërprocedurale me burime intensive të shtigjeve të ekzekutimit të kodit dhe rrjedhave të të dhënave në një program. Modaliteti është i aftë të zbulojë probleme në fazën e kompilimit, si thirrjet e dyfishta në funksionin free() për një zonë memorie, rrjedhjet e përshkruesit të skedarëve, çreferencimi dhe kalimi i treguesve null, aksesi në blloqet e memories të liruara, përdorimi i vlerave të painitializuara, etj. Përdorimi i modalitetit të ri për kodin OpenSSL ka bërë tashmë të mundur identifikimin cenueshmëri e rrezikshme.
  • Përmirësimi i optimizimeve ndërprocedurale. Leja IPA-SRA (Interprocedural Scalar Shared Replacement) është ridizajnuar për të punuar në kohën e lidhjes dhe, ndër të tjera, tani heq vlerat e llogaritura dhe të kthyera të papërdorura. Në modalitetin e optimizimit "-O2", opsioni "-finline-functions" është i aktivizuar, i cili ri-sintonizohet për të favorizuar kodin më kompakt mbi performancën e ekzekutimit. Puna e heuristikës për vendosjen e funksionit inline është përshpejtuar. Heuristikat e zgjerimit të brendshëm dhe të klonimit të funksionit tani mund të përdorin informacione rreth gamës së vlerave për të parashikuar efektivitetin e transformimeve individuale. Për C++, saktësia e analizës së pseudonimeve të bazuara në tip është përmirësuar.
  • Optimizimet e përmirësuara të kohës së lidhjes (LTO). U shtua një ekzekutues i ri lto-deponoj për të rivendosur informacionin rreth skedarëve të objektit me bytecode LTO. Kalimet paralele LTO përcaktojnë automatikisht numrin e detyrave të krijimit në të njëjtën kohë dhe, nëse ato nuk mund të përcaktohen, përdorin informacionin për numrin e bërthamave të CPU-së si një faktor paralelizimi. U shtua aftësia për të kompresuar bajtkodin LTO duke përdorur algoritmin zstd.
  • Është përmirësuar mekanizmi i optimizimit i bazuar në rezultatet e profilizimit të kodit (PGO - Profile-guided optimization), i cili gjeneron kod më optimal bazuar në një analizë të karakteristikave të ekzekutimit të kodit. Mirëmbajtja e përmirësuar e profilit gjatë përpilimit dhe ndarja e kodit të nxehtë/të ftohtë. Përmes opsionit "-fprofile-vlerat» tani mund të monitorojë deri në 4 vlera të profilit, për shembull për thirrjet indirekte dhe sigurimin e informacionit më të saktë të profilit.
  • Specifikimi i programimit paralel i zbatuar për gjuhët C, C++ dhe Fortran OpenACC 2.6, i cili përcakton mjetet për shkarkimin e operacioneve në GPU dhe procesorë të specializuar si NVIDIA PTX. Zbatimi i standardit është pothuajse i përfunduar Hap MP 5.0 (Open Multi-Processing), i cili përcakton API-në dhe metodat e aplikimit të metodave të programimit paralel në sistemet multi-core dhe hibride (CPU+GPU/DSP) me memorie të përbashkët dhe njësi vektorizimi (SIMD). Karakteristika të shtuara si kushtet e fundit private, direktivat e skanimit dhe ciklit, shprehjet porosi dhe use_device_addr. Për OpenMP dhe OpenACC, është shtuar mbështetje për shkarkimin e operacioneve në GPU-të e gjeneratës së katërt (Fixhi) dhe të gjeneratës së pestë AMD Radeon (GCN) (VEGA 10/VEGA 20).
  • Për gjuhët e familjes C, funksioni "qasje" është shtuar për të përshkruar aksesin e funksionit në objektet e kaluara me referencë ose tregues, dhe për të lidhur objekte të tilla me argumente me numra të plotë që përmbajnë informacion në lidhje me madhësinë e objekteve. Për të punuar në lidhje me "qasjen", atributi "lloj" zbatohet për të zbuluar aksesin e gabuar nga funksionet e përdoruesit, për shembull, kur shkruani vlera në një zonë jashtë kufijve të grupit. Është shtuar gjithashtu atributi "symver" për të lidhur simbolet në një skedar ELF me numra specifikë të versionit.
  • U shtuan paralajmërime të reja:
    • "-Wstring-compare" (e aktivizuar me "-Wextra") - paralajmëron për praninë e shprehjeve në të cilat zeroja krahasohet me rezultatin e thirrjes së funksioneve strcmp dhe strncmp, i cili është ekuivalent me një konstante për shkak të faktit se gjatësia i një argumenti është më i madh se madhësia e grupit në argumentin e dytë.
    • "-Wzero-length-bounds" (e aktivizuar me "-Warray-bounds") - paralajmëron për aksesin në elementët e grupit me gjatësi zero, gjë që mund të çojë në mbishkrimin e të dhënave të tjera.
    • Paralajmërimet "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" dhe "-Wstringop-overflow" janë zgjeruar për të zgjeruar numrin e situatave jashtë kufijve. që trajtohen.
  • Zbatoi aftësinë për të specifikuar drejtpërdrejt karaktere të gjera në identifikues duke përdorur kodimin aktual (UTF-8 si parazgjedhje) në vend të shënimit UCN (\uNNNN ose \UNNNNNNNN). Për shembull:

    konstante statike int π = 3;
    int get_naïve_pi() {
    kthim π;
    }

  • Për gjuhën C, një pjesë e veçorive të reja të zhvilluara brenda standardit C2X është zbatuar (mundësuar duke specifikuar -std=c2x dhe -std=gnu2x): mbështetja për sintaksën "[[]]" është shfaqur për përcaktimin e atributeve si në C++ (për shembull, [[gnu ::const]], [[deprecated]], [[fallthrough]] dhe [[maybe_unused]]. U shtua mbështetje për sintaksën "u8" për përcaktimin e konstantave me karaktere UTF-8.
    U shtuan makro të reja në . U shtuan zëvendësimet "%OB" dhe "%Ob" në strftime.

  • Modaliteti i parazgjedhur për C është "-fno-common", i cili lejon qasje më efikase në variablat globale në disa platforma.
  • Për C++ janë zbatuar rreth 16 ndryshime dhe risi, të zhvilluara në standardin C++20. Duke përfshirë fjalën kyçe të shtuar "continit"
    dhe mbështetja për shtesat e shablloneve është zbatuar "koncept". Konceptet ju lejojnë të përcaktoni një grup kërkesash për parametrat e shabllonit që, në kohën e përpilimit, kufizojnë grupin e argumenteve që mund të pranohen si parametra shabllon. Konceptet mund të përdoren për të shmangur mospërputhjet logjike midis vetive të llojeve të të dhënave të përdorura brenda shabllonit dhe vetive të tipit të të dhënave të parametrave të hyrjes.

  • G++ siguron zbulimin e sjelljes së papërcaktuar të shkaktuar nga ndryshimi i objekteve konstante përmes constexpr. Reduktimi i konsumit të memories nga përpiluesi gjatë llogaritjes së constexpr. U shtuan paralajmërime të reja "-Wmismatched-tags" dhe "-Wredundant-tags".
  • Opsionet e reja të linjës së komandës janë propozuar:
    • "-fallocation-dce" për të hequr palët e panevojshme të operatorëve "të rinj" dhe "delete".
    • "-fprofile-partial-training" për të çaktivizuar optimizimin e madhësisë për kodin që nuk ka një ekzekutim trajnimi.
    • "-fprofile-riprodhueshme për të kontrolluar nivelin e riprodhueshmërisë së profilit.
    • "-fprofile-prefix-path" për të përcaktuar direktorinë e ndërtimit të burimit bazë të përdorur për gjenerimin e profileve të veçanta (për "-fprofile-generate=profile_dir" dhe "-fprofile-use=profile_dir").
  • Në tekstin paralajmërues për opsionet e përmendura, jepen hiperlidhje që ju lejojnë të shkoni te dokumentacioni për këto opsione. Zëvendësimi i URL-së kontrollohet duke përdorur opsionin "-fdiagnostics-urls".
  • U shtua operatori i paraprocesorit "__ka_ndërtuar", e cila mund të përdoret për të kontrolluar funksionet e integruara.
  • U shtua një funksion i ri i integruar "__builtin_roundeven" me një zbatim të funksionit të rrumbullakimit të përcaktuar në specifikimin ISO/IEC TS 18661, i ngjashëm me "rrumbullakët", por pjesë rrumbullakuese më e madhe se 0.5 lart (në një vlerë më të madhe), më pak se 0.5 - poshtë (në zero), dhe e barabartë me 0.5 - duke filluar nga barazia e shifrës së parafundit.
  • Për arkitekturën AArch64, është shtuar mbështetja për shtrirjen SVE2 dhe është përmirësuar mbështetja për SVE (Extensioni i shkallëzuar i vektorit), duke përfshirë mbështetjen e shtuar për funksionet dhe llojet e integruara të SVE ACLE, dhe përdorimin e vektorizimit. Mbështetja për LSE (Large System Extensions) dhe TME (Transactional Memory Extension) është zgjeruar. U shtuan udhëzime të reja të propozuara në Armv8.5-A dhe Armv8.6-A, duke përfshirë udhëzimet për gjenerimin e numrave të rastësishëm, rrumbullakimin, lidhjen e etiketës së kujtesës,
    bfloat16 dhe shumëzimi i matricës. Mbështetje e shtuar për procesorin
    Krahu Cortex-A77,
    Krahu Cortex-A76AE,
    Krahu Cortex-A65,
    Krahu Cortex-A65AE,
    Krahu Cortex-A34 dhe
    Marvell ThunderX3.

  • Mbështetje e shtuar për ABI FDPIC (tregues funksioni 32-bit) për ARM64. Përpunimi i ridizajnuar dhe optimizuar i operacioneve me numra të plotë 64-bit. Mbështetje e shtuar për CPU
    Krahu Cortex-A77,
    Krahu Cortex-A76AE dhe
    Krahu Cortex-M35P. Mbështetje e zgjeruar për udhëzimet e përpunimit të të dhënave ACLE, duke përfshirë SIMD 32-bit, shumëzimin 16-bit, aritmetikën e mbylljes dhe optimizime të tjera të algoritmeve DSP. U shtua mbështetje eksperimentale për udhëzimet ACLE CDE (Custom Datapath Extension).

  • Gjenerimi i kodit dhe vektorizimi i përmirësuar ndjeshëm në backend për GPU-të AMD bazuar në mikroarkitekturën GCN.
  • Mbështetje e shtuar për pajisjet e ngjashme me XMEGA për arkitekturën AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608 1609, ATmega3208, ATmega3209 4808, ATmega4809 dhe ATmegaXNUMX.

  • Një shtesë e re e arkitekturës së grupit të udhëzimeve Intel ENQCMD (-menqcmd) është shtuar për arkitekturat IA-32/x86-64. Mbështetje e shtuar për CPU-të Intel Cooperlake (-march=cooperlake, përfshin shtesën AVX512BF16 ISA) dhe Tigerlake (-march=tigerlake, përfshin shtesat MOVDIRI, MOVDIR64B dhe AVX512VP2INTERSECT ISA).
  • Një zbatim i HSAIL (Gjuha e ndërmjetme e arkitekturës heterogjene të sistemit) për sistemet kompjuterike heterogjene të bazuara në arkitekturën HSA është zhvlerësuar dhe ka të ngjarë të hiqet në një version të ardhshëm.

Burimi: opennet.ru

Shto një koment