Kutolewa kwa kikundi cha mkusanyaji wa GCC 10

Baada ya mwaka wa maendeleo iliyochapishwa kutolewa kwa seti ya bure ya wakusanyaji GCC 10.1, toleo kuu la kwanza katika tawi jipya la GCC 10.x. Kulingana na mpango mpya nambari za kutolewa, toleo la 10.0 lilitumika katika mchakato wa ukuzaji, na muda mfupi kabla ya kutolewa kwa GCC 10.1, tawi la GCC 11.0 lilikuwa tayari limegawanyika, kwa msingi ambao toleo muhimu lililofuata, GCC 11.1, lingeundwa.

GCC 10.1 inajulikana kwa utekelezaji wa ubunifu mwingi katika lugha ya C++ iliyotengenezwa kwa kiwango cha C++20, maboresho yanayohusiana na kiwango cha lugha cha C cha siku zijazo (C2x), uboreshaji mpya katika viunga vya nyuma vya mkusanyaji na usaidizi wa majaribio. hali ya uchambuzi tuli. Kwa kuongezea, wakati wa utayarishaji wa tawi jipya, mradi ulihamisha hazina kutoka SVN hadi Git.

kuu mabadiliko:

  • Imeongezwa njia ya majaribio ya uchambuzi tuli "-fanaliza", ambayo hufanya uchambuzi wa mwingiliano wa rasilimali wa njia za utekelezaji wa nambari na mtiririko wa data katika programu. Hali hiyo ina uwezo wa kugundua matatizo katika hatua ya ujumuishaji, kama vile simu mara mbili kwa kazi ya bure() kwa eneo moja la kumbukumbu, uvujaji wa maelezo ya faili, kuondoa rejeleo na kupitisha viashiria visivyofaa, kufikia vizuizi vya kumbukumbu vilivyoachiliwa, kwa kutumia maadili ambayo hayajaanzishwa, n.k. Utumiaji wa hali mpya ya msimbo wa OpenSSL tayari umewezesha kutambua mazingira magumu hatari.
  • Uboreshaji wa kiutaratibu ulioboreshwa. Pasi ya IPA-SRA (Interprocedural Scalar Shared Replacement) imeundwa upya kufanya kazi kwa wakati wa kufunga na, miongoni mwa mambo mengine, sasa inaondoa thamani zilizokokotwa na kurejeshwa ambazo hazijatumika. Katika hali ya uboreshaji ya "-O2", chaguo la "-finline-functions" limewashwa, ambalo linarejeshwa ili kupendelea msimbo wa kongamano zaidi juu ya utendakazi wa utekelezaji. Kazi ya heuristic kwa uwekaji wa utendakazi wa ndani imeharakishwa. Upanuzi wa ndani na kanuni za uundaji wa utendakazi sasa zinaweza kutumia taarifa kuhusu safu za thamani kutabiri ufanisi wa mabadiliko mahususi. Kwa C++, usahihi wa uchanganuzi wa jina lak kulingana na aina umeboreshwa.
  • Uboreshaji wa Muda wa Kuunganisha (LTO). Imeongezwa mpya inayoweza kutekelezwa lto-dampo kuweka upya habari kuhusu faili za kitu na LTO bytecode. Kupita Sambamba kwa LTO huamua kiotomati idadi ya kazi zinazoendeshwa kwa wakati mmoja na, ikiwa haziwezi kubainishwa, tumia maelezo kuhusu idadi ya viini vya CPU kama kipengele cha kusawazisha. Imeongeza uwezo wa kubana LTO bytecode kwa kutumia algoriti ya zstd.
  • Utaratibu wa uboreshaji kulingana na matokeo ya uwekaji wasifu wa msimbo (PGO - Uboreshaji unaoongozwa na Wasifu) umeboreshwa, ambayo hutoa msimbo bora zaidi kulingana na uchanganuzi wa sifa za utekelezaji wa misimbo. Uboreshaji wa wasifu ulioboreshwa wakati wa ujumuishaji na utenganisho wa nambari moto/baridi. Kupitia chaguo "-fprofile-maadiliΒ»sasa inaweza kufuatilia hadi thamani 4 za wasifu, kwa mfano kwa simu zisizo za moja kwa moja na kutoa taarifa sahihi zaidi za wasifu.
  • Uainishaji wa programu sambamba umetekelezwa kwa lugha za C, C++ na Fortran OpenACC 2.6, ambayo hufafanua zana za kupakia shughuli kwenye GPU na vichakataji maalumu kama vile NVIDIA PTX. Utekelezaji wa kiwango ni karibu kukamilika Fungua MP 5.0 (Open Multi-Processing), ambayo inafafanua API na mbinu za kutumia mbinu za upangaji sambamba kwenye mifumo ya msingi na mseto (CPU+GPU/DSP) yenye vitengo vya kumbukumbu na vekta (SIMD). Vipengele vilivyoongezwa kama vile masharti ya mwisho ya kibinafsi, maagizo ya kuchanganua na kuweka kitanzi, mpangilio na usemi_kifaa_addr. Kwa OpenMP na OpenACC, usaidizi umeongezwa kwa shughuli za upakiaji kwenye kizazi cha nne (Fiji) na kizazi cha tano cha AMD Radeon (GCN) GPUs (VEGA 10/VEGA 20).
  • Kwa lugha za familia ya C, chaguo la kukokotoa la "ufikiaji" limeongezwa ili kuelezea ufikiaji wa chaguo la kukokotoa kwa vitu vilivyopitishwa kwa rejeleo au kielekezi, na kuhusisha vitu kama hivyo na hoja kamili zilizo na habari kuhusu saizi ya vitu. Kufanya kazi kwa kushirikiana na "ufikiaji", sifa ya "aina" inatekelezwa ili kugundua ufikiaji usio sahihi kutoka kwa kazi za mtumiaji, kwa mfano, wakati wa kuandika maadili kwa eneo nje ya mipaka ya safu. Pia imeongezwa ni sifa ya "symver" ya alama shirikishi katika faili ya ELF iliyo na nambari maalum za toleo.
  • Maonyo mapya yameongezwa:
    • "-Wstring-compare" (imewezeshwa na "-Wextra") - inaonya juu ya uwepo wa misemo ambayo sifuri inalinganishwa na matokeo ya kuita kazi za strcmp na strncmp, ambayo ni sawa na mara kwa mara kwa sababu ya ukweli kwamba urefu. ya hoja moja ni kubwa kuliko saizi ya safu katika hoja ya pili .
    • "-Wzero-length-bounds" (imewezeshwa na "-Warray-bounds") - inaonya kuhusu kufikia vipengele vya safu ya urefu wa sifuri, ambayo inaweza kusababisha kufuta data nyingine.
    • Maonyo ya β€œ-Warray-bounds”, β€œ-Wformat-overflow”, β€œ-Wrestrick”, β€œ-Wreturn-local-addr” na β€œ-Wstringop-overflow” yamepanuliwa ili kupanua idadi ya hali za nje ya mipaka. zinazoshughulikiwa.
  • Imetekeleza uwezo wa kubainisha herufi pana moja kwa moja katika vitambulishi kwa kutumia usimbaji wa sasa (UTF-8 kwa chaguomsingi) badala ya nukuu za UCN (\uNNNN au \UNNNNNNNNN). Kwa mfano:

    tuli const int Ο€ = 3;
    int get_naΓ―ve_pi() {
    kurudi Ο€;
    }

  • Kwa lugha ya C, sehemu ya vipengele vipya vilivyotengenezwa ndani ya kiwango cha C2X kimetekelezwa (imewezeshwa kwa kubainisha -std=c2x na -std=gnu2x): msaada wa sintaksia ya β€œ[[]]” imeonekana kwa ajili ya kufafanua sifa kama ilivyo C++ (kwa mfano, [[gnu ::const]], [[deprecated]], [[fallthrough]] na [[labda_unused]]. Usaidizi ulioongezwa wa sintaksia ya "u8" ya kufafanua viambajengo vyenye vibambo vya UTF-8.
    Imeongeza makro mpya kwa . Imeongeza "%OB" na "%Ob" mbadala za strftime.

  • Hali chaguo-msingi ya C ni "-fno-common", ambayo inaruhusu ufikiaji bora zaidi wa vigeu vya kimataifa kwenye baadhi ya majukwaa.
  • Kwa C ++, kuhusu mabadiliko 16 na ubunifu umetekelezwa, ulioandaliwa katika kiwango cha C ++20. Ikiwa ni pamoja na neno kuu lililoongezwa "constinit"
    na usaidizi wa upanuzi wa kiolezo umetekelezwa "dhana". Dhana hukuruhusu kufafanua seti ya mahitaji ya kigezo cha kiolezo ambacho, kwa wakati wa kukusanya, hupunguza seti ya hoja zinazoweza kukubalika kama vigezo vya kiolezo. Dhana zinaweza kutumika ili kuepuka kutofautiana kimantiki kati ya sifa za aina za data zinazotumiwa ndani ya kiolezo na sifa za aina ya data za vigezo vya ingizo.

  • G++ hutoa ugunduzi wa tabia isiyobainishwa inayosababishwa na kubadilisha vitu mara kwa mara kupitia constexpr. Kupunguza matumizi ya kumbukumbu na mkusanyaji wakati wa kuhesabu constexpr. Imeongeza maonyo mapya "-Wmismatched-tags" na "-Wredundant-tags".
  • Chaguzi mpya za mstari wa amri zimependekezwa:
    • "-fallocation-dce" ili kuondoa jozi zisizo za lazima za waendeshaji "mpya" na "futa".
    • "-fprofile-partial-training" ili kuzima uboreshaji wa ukubwa kwa msimbo ambao hauna mafunzo.
    • "-fprofile-inaweza kuzalishwa ili kudhibiti kiwango cha uzalishaji wa wasifu.
    • "-fprofile-prefix-path" ili kufafanua saraka ya uundaji wa chanzo msingi inayotumika kwa utengenezaji tofauti wa wasifu (kwa "-fprofile-generate=profile_dir" na "-fprofile-use=profile_dir").
  • Katika maandishi ya onyo kwa chaguo zilizotajwa, viungo vinatolewa vinavyokuwezesha kwenda kwenye nyaraka za chaguo hizi. Ubadilishaji wa URL unadhibitiwa kwa kutumia chaguo la "-fdiagnostics-urls".
  • Aliongeza opereta wa kichakataji "__imejenga", ambayo inaweza kutumika kuangalia vitendaji vilivyojumuishwa.
  • Imeongeza kitendakazi kipya kilichojengewa ndani "__builtin_roundeven" na utekelezaji wa kazi ya kuzungusha iliyofafanuliwa katika vipimo vya ISO/IEC TS 18661, sawa na "mviringo", lakini sehemu inayozungusha zaidi ya 0.5 juu (hadi thamani kubwa), chini ya 0.5 - chini (hadi sifuri), na sawa na 0.5 - kuanzia usawa wa tarakimu ya penultimate.
  • Kwa usanifu wa AArch64, usaidizi wa kiendelezi cha SVE2 umeongezwa na usaidizi wa SVE (Scalable Vector Extension) umeboreshwa, ikijumuisha usaidizi ulioongezwa wa vitendaji na aina za SVE ACLE zilizojengewa ndani, na matumizi ya vekta. Usaidizi kwa LSE (Viendelezi Kubwa vya Mfumo) na TME (Kiendelezi cha Kumbukumbu ya Muamala) umepanuliwa. Imeongeza maagizo mapya yaliyopendekezwa katika Armv8.5-A na Armv8.6-A, ikijumuisha maagizo ya kutengeneza nambari nasibu, kuzungusha, kufunga lebo ya kumbukumbu,
    bfloat16 na kuzidisha matrix. Aliongeza msaada wa processor
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 na
    Marvell ThunderX3.

  • Usaidizi umeongezwa kwa ABI FDPIC (viashiria vya utendakazi vya biti 32) kwa ARM64. Uchakataji upya na kuboreshwa wa shughuli kamili za biti 64. Imeongeza usaidizi wa CPU
    Arm Cortex-A77,
    Arm Cortex-A76AE na
    Arm Cortex-M35P. Usaidizi uliopanuliwa wa maagizo ya kuchakata data ya ACLE, ikijumuisha SIMD ya 32-bit, kuzidisha 16-bit, hesabu ya latch, na uboreshaji mwingine wa algoriti ya DSP. Umeongeza usaidizi wa majaribio kwa maagizo ya ACLE CDE (Kiendelezi cha Datapath Maalum).

  • Uzalishaji wa msimbo ulioboreshwa kwa kiasi kikubwa na uwekaji vekta katika sehemu ya nyuma ya AMD GPU kulingana na usanifu mdogo wa GCN.
  • Usaidizi ulioongezwa kwa vifaa vinavyofanana na XMEGA vya usanifu wa AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608 ATmega1609 ATmega3208, ATmega3209 ATmega4808 mega4809 na ATmegaXNUMX.

  • Kiendelezi kipya cha usanifu wa maagizo ya Intel ENQCMD (-menqcmd) kimeongezwa kwa usanifu wa IA-32/x86-64. Usaidizi ulioongezwa kwa Intel Cooperlake (-march=cooperlake, inajumuisha kiendelezi cha AVX512BF16 ISA) na Tigerlake (-march=tigerlake, inajumuisha CPU za MOVDIRI, MOVDIR64B na AVX512VP2INTERSECT ISA).
  • Utekelezaji wa HSAIL (Lugha ya Kati ya Usanifu wa Mfumo wa Heterogeneous) kwa mifumo tofauti ya kompyuta kulingana na usanifu wa HSA umeacha kutumika na kuna uwezekano utaondolewa katika toleo la baadaye.

Chanzo: opennet.ru

Kuongeza maoni