Izdanje GCC 9 kompajlerskog paketa

Nakon godinu dana razvoja objavljeno izdanje besplatnog skupa kompajlera GCC 9.1, prvo veliko izdanje u novoj grani GCC 9.x. U skladu sa nova šema izdanja, verzija 9.0 je korištena u procesu razvoja, a neposredno prije izlaska GCC 9.1, grana GCC 10.0 se već razgranala, na osnovu koje će se formirati sljedeće značajno izdanje, GCC 10.1.

GCC 9.1 je poznat po stabilizaciji podrške za C++17 standard, nastavljanju implementacije mogućnosti budućeg C++20 standarda (kodnog naziva C++2a), uključivanju u frontend za jezik D, djelomičnoj podršci za OpenMP 5.0 , skoro potpuna podrška za OpenACC 2.5, povećanje skalabilnosti međuproceduralnih optimizacija i optimizacija u fazi povezivanja, proširenje dijagnostičkih alata i dodavanje novih upozorenja, backend-a za OpenRISC, C-SKY V2 i AMD GCN GPU.

Glavni promjena:

  • Dodata podrška za programski jezik D. GCC uključuje frontend sa kompajlerom GDC (Gnu D Compiler) i runtime biblioteke (libphobos), koje vam omogućavaju da koristite standardni GCC za pravljenje programa u programskom jeziku D. Proces omogućavanja podrške za jezik D u GCC-u poćelo je još 2011, ali vukla se zbog potrebe usklađivanja koda sa zahtjevima GCC-a i problema s prijenosom prava intelektualne svojine na Digital Mars, koji razvija programski jezik D;
  • Napravljena su poboljšanja u generatoru koda. Na primjer, implementirana je upotreba različitih strategija za proširenje Switch izraza (tabela skokova, test bitova, stablo odlučivanja) ovisno o situacijama. Dodata je mogućnost transformacije linearnih funkcija koje uključuju Switch izraz koristeći optimizaciju „-ftree-switch-conversion” (na primjer, skup uslova kao što je „slučaj 2: kako = 205; prekid; slučaj 3: kako = 305; prekid ;” će biti konvertovano u "100 * kako + 5";
  • Poboljšane interproceduralne optimizacije. Inline postavke implementacije su prilagođene za moderne C++ baze koda i proširene novim parametrima max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns i uninlined -vreme za razmišljanje. Poboljšana preciznost i agresivnost odvajanja hladnog/vrućeg koda. Poboljšana skalabilnost za vrlo velike prevodilačke jedinice (na primjer, kod primjene optimizacije u fazi povezivanja na velike programe);
  • Poboljšan je mehanizam optimizacije na osnovu rezultata profilisanja koda (PGO - Profile-guided optimization), koji generiše optimalniji kod na osnovu analize karakteristika izvršavanja koda. Opcija sažetka "-fprofile-use" sada uključuje modove optimizacije "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" i "-ftree-loop-distribution". Uklonjeno je uključivanje histograma sa brojačima u fajlove, što je smanjilo veličinu fajlova sa profilima (histogrami se sada generišu u hodu prilikom izvođenja optimizacija tokom povezivanja);
  • Poboljšane optimizacije vremena povezivanja (LTO). Pojednostavljenje tipova je omogućeno prije generiranja rezultata, što je omogućilo značajno smanjenje veličine LTO objektnih datoteka, smanjenje potrošnje memorije u fazi povezivanja i poboljšanje paralelizacije operacija. Broj particija (-param lto-partitions) je povećan sa 32 na 128, što poboljšava performanse na sistemima sa velikim brojem CPU niti. Dodan je parametar za kontrolu broja procesa optimizacije
    "-param lto-max-streaming-parallelism";

    Kao rezultat toga, u poređenju sa GCC 8.3, optimizacije uvedene u GCC 9 dozvoljeno smanjiti vrijeme kompilacije Firefox 5 i LibreOffice 66 za oko 6.2.3%. Veličina objektnih datoteka smanjena je za 7%. Vrijeme povezivanja na 8-jezgrenom CPU-u smanjeno je za 11%. Faza sekvencijalne optimizacije faze povezivanja sada je 28% brža i troši 20% manje memorije. Potrošnja memorije svakog procesora paralelizovane faze LTO smanjena je za 30%;

  • Većina specifikacija paralelnog programiranja implementirana je za jezike C, C++ i Fortran OpenACC 2.5, koji definiše alate za preuzimanje operacija na GPU-ovima i specijalizovanim procesorima kao što je NVIDIA PTX;
  • Delimična podrška za standard je implementirana za C i C++ Otvorite MP 5.0 (Open Multi-Processing), koji definira API i metode primjene metoda paralelnog programiranja za C, C++ i Fortran jezike na višejezgrenim i hibridnim (CPU+GPU/DSP) sistemima sa zajedničkom memorijom i jedinicama vektorizacije (SIMD) ;
  • Dodata su nova upozorenja za jezik C: "-Saddress-of-packed-member" (vrijednost neusklađenog pokazivača na upakovani član strukture ili unije) i
    «-Wapsolutna vrijednost" (kada pristupate funkcijama za izračunavanje apsolutne vrijednosti, ako postoji prikladnija funkcija za navedeni argument, na primjer, fabs(3.14) treba koristiti umjesto abs(3.14). Dodata su nova upozorenja za C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpesimizing-move" i "-Wclass-conversion". Mnoga ranije dostupna upozorenja su proširena;

  • Dodata eksperimentalna podrška za dio budućeg standarda jezika C, kodnog naziva C2x. Da biste omogućili podršku za C2x, koristite opcije "-std=c2x" i "-std=gnu2x" (da biste omogućili GNU ekstenzije). Standard je još uvijek u ranoj fazi razvoja, stoga je od njegovih mogućnosti podržan samo izraz _Static_assert sa jednim argumentom (_Static_assert sa dva argumenta je standardizovan u C11);
  • Podrška za C++17 standard je proglašena stabilnom. U frontendu, jezičke mogućnosti C++17 su u potpunosti implementirane, au libstdc++, bibliotečke funkcije definirane u standardu su blizu punoj implementaciji;
  • Nastavljeno implementacija elementi budućeg C++2a standarda. Na primjer, dodata je mogućnost uključivanja raspona tokom inicijalizacije, implementirane su ekstenzije za lambda izraze, dodata je podrška za prazne članove struktura podataka i vjerovatne/nevjerovatne atribute, omogućena je mogućnost pozivanja virtualnih funkcija u uvjetnim izrazima , itd.
    Da biste omogućili podršku za C++2a, koristite opcije "-std=c++2a" i "-std=gnu++2a". Dodane datoteke zaglavlja bitova i verzije u libstdc++ za C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity osobine, std::midpoint, funkcije std::midpoint, , std::bind_front,
    std::visit, std::is_constant_evaluated i std::assume_aligned, dodana podrška za tip char8_t, implementirana mogućnost provjere prefiksa i sufiksa stringova (počinje_sa, završava_sa);

  • Dodata podrška za nove ARM procesore
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE i Neoverse N1. Dodata podrška za uputstva uvedena u Armv8.3-A za rad sa kompleksnim brojevima, generisanje pseudoslučajnih brojeva (rng) i označavanje memorije (memtag), kao i uputstva za blokiranje napada koji se odnose na spekulativno izvršenje i rad jedinice za predviđanje grananja . Za arhitekturu AArch64, dodat je način zaštite sjecišta steka i gomile (“-fstack-clash-protection”). Za korištenje karakteristika Armv8.5-A arhitekture, dodana je opcija “-march=armv8.5-a”

  • Uključuje pozadinu za generiranje koda za AMD GPU-ove zasnovane na GCN mikroarhitekturi. Implementacija je trenutno ograničena na kompilaciju jednonitnih aplikacija (podrška za izvođenje višenitnih kalkulacija putem OpenMP-a i OpenACC-a će biti ponuđena kasnije) i podršku za GPU Fiji i Vega 10;
  • Dodan novi backend za procesore OpenRISC;
  • Dodan backend za procesore C-SKY V2, koju proizvodi istoimena kineska kompanija za razne potrošačke uređaje;
  • Sve opcije komandne linije koje upravljaju vrijednostima bajtova podržavaju sufikse kb, KiB, MB, MiB, GB i GiB;
  • Implementirano opcija “-flive-patching=[inline-only-static|inline-clone]” vam omogućava da postignete sigurnu kompilaciju za sisteme za zakrpe uživo zbog kontrole na više nivoa nad upotrebom međuproceduralnih (IPA) optimizacije;
  • Dodata opcija "--completion" za detaljnu kontrolu završetka opcije kada se koristi bash;
  • Dijagnostički alati pružaju prikaze izvoda izvornog teksta koji ukazuju na broj reda i vizuelno označavaju povezane informacije, kao što su tipovi operanda. Da biste onemogućili prikaz brojeva linija i oznaka, dostupne su opcije “-fno-diagnostics-show-line-numbers” i “-fno-diagnostics-show-labels”;

    Izdanje GCC 9 kompajlerskog paketa

  • Prošireno alati za dijagnosticiranje grešaka u C++ kodu, poboljšana čitljivost informacija o uzrocima grešaka i isticanje problematičnih parametara;

    Izdanje GCC 9 kompajlerskog paketa

  • Dodata opcija “-fdiagnostics-format=json”, koja omogućava generisanje dijagnostičkog izlaza u mašinski čitljivom formatu (JSON);
  • Dodane su nove opcije profiliranja “-fprofile-filter-files” i “-fprofile-exclude-files” za odabir izvornih datoteka koje će se obraditi;
  • AddressSanitizer obezbeđuje generisanje kompaktnijeg verifikacionog koda za automatske varijable, što smanjuje potrošnju memorije izvršne datoteke koja se proverava;
  • Poboljšan izlaz u "-fopt-info» (detaljne informacije o dodatnim optimizacijama). Dodati novi prefiksi "optimizirano" i "propušteno", pored prethodno dostupnog prefiksa "napomena". Dodati izlaz informacija o donošenju odluka o inline-otkrivanju i vektorizaciji ciklusa;
  • Dodata opcija “-fsave-optimization-record”, kada je navedena, GCC sprema datoteku SRCFILE.opt-record.json.gz sa opisom odluka o korištenju određenih optimizacija. Nova opcija se razlikuje od “-fopt-info” moda tako što uključuje dodatne metapodatke, kao što su informacije o profilu i inline lancima;
  • Dodane opcije “-fipa-stack-alignment” i “-fipa-reference-addressable” za kontrolu poravnanja steka i korištenje načina adresiranja (samo za pisanje ili točno čitanje) za statičke varijable tokom međuproceduralnih optimizacija;
  • Uvedene su nove ugrađene funkcije za kontrolu povezivanja atributa kao i ponašanja vezanog za predviđanje grananja i spekulativno izvršavanje instrukcija: "__builtin_has_attribute","__builtin_expect_with_probability" i "__builtin_speculation_safe_value". Dodan je novi atribut za funkcije, varijable i tipove kopiraj;
  • Potpuna podrška za asinhroni ulaz/izlaz je implementirana za jezik Fortran;
  • Podrška za Solaris 10 (*-*-solaris2.10) i Cell/BE (Cell Broadband Engine SPU) platforme je zastarjela i bit će uklonjena u sljedećem velikom izdanju. Podrška za Armv2, Armv3, Armv5 i Armv5E arhitekture je ukinuta. Podrška za Intel MPX (Memory Protection Extensions) je ukinuta.

izvor: opennet.ru

Dodajte komentar