GCC 10 kompilatoru komplekta izlaiŔana

Pēc gada attÄ«stÄ«bas publicēta bezmaksas kompilatoru komplekta izlaiÅ”ana GCC 10.1, pirmais lielais laidiens jaunajā GCC 10.x atzarā. Saskaņā ar jauna shēma izlaiduma numurus, izstrādes procesā tika izmantota versija 10.0 un Ä«si pirms GCC 10.1 iznākÅ”anas jau bija atzarojies GCC 11.0 atzars, uz kura pamata veidotos nākamais nozÄ«mÄ«gais laidiens GCC 11.1.

GCC 10.1 ir ievērojams ar daudzu jauninājumu ievieÅ”anu C++ valodā, kas izstrādāta C++20 standartam, uzlabojumiem, kas saistÄ«ti ar topoÅ”o C valodas standartu (C2x), jaunām optimizācijām kompilatoru aizmugursistēmās un eksperimentālo atbalstu. statiskās analÄ«zes režīms. Turklāt jaunas filiāles sagatavoÅ”anas laikā projekts pārcēla repozitoriju no SVN uz Git.

Galvenais izmaiņas:

  • Pievienots Statiskās analÄ«zes eksperimentālais režīms "- fanalizatorsā€œ, kas veic resursietilpÄ«gu koda izpildes ceļu un datu plÅ«smu starpprocedÅ«ru analÄ«zi programmā. Režīms spēj atklāt problēmas kompilācijas stadijā, piemēram, dubultus izsaukumus uz free() funkciju vienam atmiņas apgabalam, faila deskriptora noplÅ«des, atsauces atcelÅ”anu un nulles rādÄ«tāju nodoÅ”anu, piekļuvi atbrÄ«votajiem atmiņas blokiem, neinicializētu vērtÄ«bu izmantoÅ”anu utt. Jaunā režīma izmantoÅ”ana OpenSSL kodam jau ir ļāvusi identificēt bÄ«stama ievainojamÄ«ba.
  • Uzlabota starpprocedÅ«ru optimizācija. IPA-SRA (Interprocedural Scalar Shared Replacement) caurlaide ir pārveidota, lai tā darbotos saistÄ«Å”anas laikā, un cita starpā tagad tiek noņemtas aprēķinātās un atgrieztās neizmantotās vērtÄ«bas. Optimizācijas režīmā "-O2" ir iespējota opcija "-finline-functions", kas tiek pārregulēta, lai dotu priekÅ”roku kompaktākam kodam, nevis izpildes veiktspējai. Ir paātrināts iekļauto funkciju izvietoÅ”anas heiristikas darbs. Iekļautās paplaÅ”ināŔanas un funkciju klonÄ“Å”anas heiristika tagad var izmantot informāciju par vērtÄ«bu diapazoniem, lai prognozētu atseviŔķu transformāciju efektivitāti. Programmai C++ ir uzlabota uz tipu balstÄ«tās aizstājvārdu parsÄ“Å”anas precizitāte.
  • Uzlabota saistÄ«Å”anas laika optimizācija (LTO). Pievienots jauns izpildāmais fails lto-dump lai atiestatÄ«tu informāciju par objektu failiem ar LTO baitu kodu. Paralēlās LTO caurlaides automātiski nosaka vienlaicÄ«gi izpildāmo make uzdevumu skaitu un, ja tos nevar noteikt, kā paralēlizācijas koeficientu izmanto informāciju par CPU kodolu skaitu. Pievienota iespēja saspiest LTO baitu kodu, izmantojot zstd algoritmu.
  • Uzlabots optimizācijas mehānisms, kas balstÄ«ts uz koda profilÄ“Å”anas rezultātiem (PGO - Profile-guided optimization), kas Ä£enerē optimālāku kodu, pamatojoties uz koda izpildes Ä«paŔību analÄ«zi. Uzlabota profila uzturÄ“Å”ana kompilācijas un karstā/aukstā koda atdalÄ«Å”anas laikā. Izmantojot opciju "-fprofila vērtÄ«basĀ» tagad var pārraudzÄ«t lÄ«dz 4 profila vērtÄ«bām, piemēram, netieÅ”iem zvaniem un sniedzot precÄ«zāku profila informāciju.
  • Paralēlās programmÄ“Å”anas specifikācija ieviesta C, C++ un Fortran valodām OpenACC 2.6, kas definē rÄ«kus GPU un specializēto procesoru, piemēram, NVIDIA PTX, izkrauÅ”anas operāciju veikÅ”anai. Standarta ievieÅ”ana ir gandrÄ«z pabeigta OpenMP 5.0 (Open Multi-Processing), kas nosaka API un paralēlās programmÄ“Å”anas metožu pielietoÅ”anas metodes daudzkodolu un hibrÄ«dsistēmās (CPU+GPU/DSP) ar koplietojamo atmiņu un vektorizācijas vienÄ«bām (SIMD). Pievienotas funkcijas, piemēram, pēdējais privātais nosacÄ«jums, skenÄ“Å”anas un cilpas direktÄ«vas, secÄ«bas un use_device_addr izteiksmes. OpenMP un OpenACC ir pievienots atbalsts izkrauÅ”anas darbÄ«bām ceturtās paaudzes (Fidži) un piektās paaudzes AMD Radeon (GCN) GPU (VEGA 10/VEGA 20).
  • C saimes valodām ir pievienota funkcija ā€œpiekļuveā€, lai aprakstÄ«tu funkcijas piekļuvi objektiem, kas nodoti ar atsauci vai rādÄ«tāju, un saistÄ«tu Ŕādus objektus ar veselu skaitļu argumentiem, kas satur informāciju par objektu lielumu. Lai strādātu kopā ar ā€œaccessā€, tiek ieviests atribÅ«ts ā€œtypeā€, lai noteiktu nepareizu piekļuvi no lietotāja funkcijām, piemēram, ierakstot vērtÄ«bas apgabalā ārpus masÄ«va robežām. Ir pievienots arÄ« atribÅ«ts "symver", lai saistÄ«tu simbolus ELF failā ar konkrētiem versiju numuriem.
  • Pievienoti jauni brÄ«dinājumi:
    • ā€œ-Wstring-compareā€ (iespējots ar ā€œ-Wextraā€) - brÄ«dina par tādu izteiksmju klātbÅ«tni, kurās nulle tiek salÄ«dzināta ar strcmp un strncmp funkciju izsaukÅ”anas rezultātu, kas ir lÄ«dzvērtÄ«ga konstantei, jo garums viena argumenta lielums ir lielāks par masÄ«va lielumu otrajā argumentā .
    • "-Wzero-length-bounds" (iespējots ar "-Warray-bounds") ā€” brÄ«dina par piekļuvi nulles garuma masÄ«va elementiem, kas var novest pie citu datu pārrakstÄ«Å”anas.
    • BrÄ«dinājumi ā€œ-Warray-boundsā€, ā€œ-Wformat-overflowā€, ā€œ-Wrestrictā€, ā€œ-Wreturn-local-addrā€ un ā€œ-Wstringop-overflowā€ ir paplaÅ”ināti, lai palielinātu ārpus robežu situāciju skaitu. kas tiek apstrādāti.
  • Ieviesta iespēja tieÅ”i norādÄ«t platas rakstzÄ«mes identifikatoros, izmantojot paÅ”reizējo kodējumu (pēc noklusējuma UTF-8), nevis UCN apzÄ«mējumu (\uNNNN vai \UNNNNNNNN). Piemēram:

    statiskā konst int Ļ€ = 3;
    int get_naive_pi() {
    atgrieÅ”anās Ļ€;
    }

  • C valodai ir ieviesta daļa jauno funkciju, kas izstrādātas C2X standartā (iespējota, norādot -std=c2x un -std=gnu2x): ir parādÄ«jies atbalsts ā€œ[[]]ā€ sintaksei, lai definētu atribÅ«tus, kā C++ (piemēram, [[gnu ::const]], [[novecojis]], [[fallthrough]] un [[maybe_unused]]. Pievienots "u8" sintakses atbalsts konstantu definÄ“Å”anai ar UTF-8 rakstzÄ«mēm.
    Pievienoti jauni makro . Strftime pievienoti "%OB" un "%Ob" aizvietojumi.

  • C noklusējuma režīms ir "-fno-common", kas dažās platformās ļauj efektÄ«vāk piekļūt globālajiem mainÄ«gajiem.
  • AttiecÄ«bā uz C++ ir ieviestas aptuveni 16 izmaiņas un jauninājumi, kas izstrādāti C++20 standartā. Ieskaitot pievienoto atslēgvārdu ā€œconstitinā€
    un ir ieviests atbalsts veidņu paplaÅ”inājumiem "jēdzieni". Jēdzieni ļauj definēt veidnes parametru prasÄ«bu kopu, kas kompilÄ“Å”anas laikā ierobežo argumentu kopu, ko var pieņemt kā veidnes parametrus. Jēdzienus var izmantot, lai izvairÄ«tos no loÄ£iskām pretrunām starp veidnē izmantoto datu tipu Ä«paŔībām un ievades parametru datu tipa Ä«paŔībām.

  • G++ nodroÅ”ina nenoteiktas uzvedÄ«bas noteikÅ”anu, ko izraisa nemainÄ«gu objektu maiņa, izmantojot constexpr. Samazināts kompilatora atmiņas patēriņŔ, aprēķinot constexpr. Pievienoti jauni brÄ«dinājumi "-Wmismatched-tags" un "-Wredundant-tags".
  • Ir ierosinātas jaunas komandrindas opcijas:
    • "-fallocation-dce", lai noņemtu nevajadzÄ«gos operatoru "new" un "delete" pārus.
    • "-fprofile-partial-training", lai atspējotu izmēra optimizāciju kodam, kuram nav treniņa.
    • "-fprofile-reproducējams, lai kontrolētu profila reproducējamÄ«bas lÄ«meni.
    • "-fprofile-prefix-path", lai definētu pamata avota veidoÅ”anas direktoriju, ko izmanto atseviŔķai profila Ä£enerÄ“Å”anai ("-fprofile-generate=profile_dir" un "-fprofile-use=profile_dir").
  • Minēto opciju brÄ«dinājuma tekstā ir norādÄ«tas hipersaites, kas ļauj pāriet uz Å”o opciju dokumentāciju. URL aizstāŔana tiek kontrolēta, izmantojot opciju "-fdiagnostics-urls".
  • Pievienots priekÅ”apstrādātāja operators "__ir_builtin", ko var izmantot, lai pārbaudÄ«tu iebÅ«vētās funkcijas.
  • Pievienota jauna iebÅ«vēta funkcija "__builtin_roundeven" ar ISO/IEC TS 18661 specifikācijā definētās noapaļoÅ”anas funkcijas ievieÅ”anu, kas ir lÄ«dzÄ«ga "apaļoÅ”anai", bet noapaļo daļu, kas lielāka par 0.5 uz augÅ”u (lÄ«dz lielākai vērtÄ«bai), mazāka par 0.5 - uz leju (lÄ«dz nullei) un vienāds ar 0.5 - sākot no priekÅ”pēdējā cipara paritātes.
  • AArch64 arhitektÅ«rai ir pievienots atbalsts SVE2 paplaÅ”inājumam un ir uzlabots atbalsts SVE (Scalable Vector Extension), tostarp pievienots atbalsts iebÅ«vētajām SVE ACLE funkcijām un veidiem, kā arÄ« vektorizācijas izmantoÅ”ana. Ir paplaÅ”ināts atbalsts LSE (Lielie sistēmas paplaÅ”inājumi) un TME (Transactional Memory Extension). Pievienotas jaunas instrukcijas, kas piedāvātas Armv8.5-A un Armv8.6-A, tostarp norādÄ«jumi par nejauÅ”u skaitļu Ä£enerÄ“Å”anu, noapaļoÅ”anu, atmiņas tagu saistÄ«Å”anu,
    bfloat16 un matricas reizināŔanu. Pievienots procesora atbalsts
    Roka Cortex-A77,
    Roka Cortex-A76AE,
    Roka Cortex-A65,
    Roka Cortex-A65AE,
    Roka Cortex-A34 un
    Marvell ThunderX3.

  • Pievienots atbalsts ABI FDPIC (32 bitu funkciju norādes) ARM64. Pārstrādāta un optimizēta 64 bitu veselu skaitļu operāciju apstrāde. Pievienots CPU atbalsts
    Roka Cortex-A77,
    Roka Cortex-A76AE un
    Roka Cortex-M35P. PaplaÅ”ināts atbalsts ACLE datu apstrādes instrukcijām, tostarp 32 bitu SIMD, 16 bitu reizināŔana, fiksācijas aritmētika un citas DSP algoritmu optimizācijas. Pievienots eksperimentāls atbalsts ACLE CDE (Custom Datapath Extension) instrukcijām.

  • Ievērojami uzlabota koda Ä£enerÄ“Å”ana un vektorizācija AMD GPU aizmugursistēmā, kuras pamatā ir GCN mikroarhitektÅ«ra.
  • Pievienots atbalsts XMEGA lÄ«dzÄ«gām ierÄ«cēm AVR arhitektÅ«rai
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808ATga809ATme1608 1609, ATmega3208, ATmega3209 4808, ATmega4809 un ATmegaXNUMX.

  • Ir pievienots jauns Intel ENQCMD instrukciju kopas arhitektÅ«ras paplaÅ”inājums (-menqcmd) IA-32/x86-64 arhitektÅ«rām. Pievienots atbalsts Intel Cooperlake (-march=cooperlake, ietver AVX512BF16 ISA paplaÅ”inājumu) un Tigerlake (-march=tigerlake, ietver MOVDIRI, MOVDIR64B un AVX512VP2INTERSECT ISA paplaÅ”inājumus) CPU.
  • HSAIL (neviendabÄ«gās sistēmas arhitektÅ«ras starpvalodas) ievieÅ”ana neviendabÄ«gām skaitļoÅ”anas sistēmām, kuru pamatā ir HSA arhitektÅ«ra, ir novecojusi un, iespējams, tiks noņemta nākamajā laidienā.

Avots: opennet.ru

Pievieno komentāru