Verëffentlechung vun der GCC 9 Compiler Suite

No engem Joer vun Entwécklung publizéiert Verëffentlechung vun engem gratis Set vu Compilers GCC 9.1, déi éischt grouss Verëffentlechung an der neier GCC 9.x Branche. Am Aklang mat neie Schema Verëffentlechungsnummeren, Versioun 9.0 gouf am Entwécklungsprozess benotzt, a kuerz virun der Verëffentlechung vum GCC 9.1 war d'GCC 10.0 Branche schonn ofgeschnidden, op Basis vun där déi nächst bedeitend Verëffentlechung, GCC 10.1, geformt gëtt.

GCC 9.1 ass bemierkenswäert fir d'Ënnerstëtzung fir den C++17 Standard ze stabiliséieren, d'Fähigkeiten vum zukünftegen C++20 Standard (Codenamed C++2a) ëmzesetzen, Inklusioun am Frontend fir d'D Sprooch, deelweis Ënnerstëtzung fir OpenMP 5.0 , bal komplett Ënnerstëtzung fir OpenACC 2.5, d'Skalierbarkeet vun interprozeduralen Optimisatiounen an Optimisatiounen op der verbindlecher Etapp erhéijen, d'Erweiderung vun diagnostesche Tools an Zousatz vun neie Warnungen, Backends fir OpenRISC, C-SKY V2 an AMD GCN GPU.

Haaptstrooss änneren:

  • Zousätzlech Ënnerstëtzung fir d'Programméiersprooch D. GCC enthält e Frontend mat engem Compiler GDC (Gnu D Compiler) a Runtime Bibliothéiken (libphobos), déi Iech erlaben Standard GCC ze benotzen fir Programmer an der Programmiersprache D ze bauen. huet ugefaangen zréck an 2011, mä weider gezunn wéinst der Bedierfnes fir de Code an d'Konformitéit mat GCC Ufuerderungen a Probleemer mam Transfert vun den intellektuellen Eegentumsrechter op Digital Mars ze bréngen, déi d'Programméierungssprooch D entwéckelt;
  • Verbesserunge goufen am Code Generator gemaach. Zum Beispill, d'Benotzung vu verschiddene Strategien fir d'Ausdehnung vu Schalterausdréck (Sprangtabell, Bittest, Entscheedungsbam) jee no Situatiounen ëmgesat ginn. D'Fäegkeet bäigefüügt fir linear Funktiounen ze transforméieren déi e Switch Ausdrock enthalen mat der "-ftree-switch-conversion" Optimiséierung (zum Beispill eng Rei vu Konditioune wéi "Fall 2: wéi = 205; Paus; Fall 3: wéi = 305; Paus ;" gëtt op "100 * wéi + 5" ëmgewandelt;
  • Verbesserte interprozedural Optimisatiounen. Inline Deployment Astellunge goufen fir modern C++ Codebasen ugepasst an erweidert mat neie Parameteren max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-inss an uninlined -Tunk-Zäit. Verbessert Richtegkeet an aggressiveness vun kal / waarm Code Trennung. Verbessert Skalierbarkeet fir ganz grouss Iwwersetzung Unitéiten (zum Beispill, wann Dir Optimisatioun an der Verbindungsstadium op grouss Programmer applizéiert);
  • Den Optimiséierungsmechanismus baséiert op de Resultater vun der Codeprofiléierung (PGO - Profil guidéiert Optimiséierung) gouf verbessert, wat méi optimal Code generéiert baséiert op enger Analyse vun de Charakteristiken vun der Code Ausféierung. Resumé Optioun "-fprofile-benotzen" enthält elo d'Optimiséierungsmodi "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" an "-ftree-loop-distribution". Geläscht d'Inklusioun vun Histogramme mat Zähler an Dateien, wat d'Gréisst vun de Dateien mat Profiler reduzéiert huet (Histogramme ginn elo op der Flucht generéiert wann Dir Optimisatiounen beim Verknëppung ausféiert);
  • Verbesserte Verknëppungszäitoptimisatiounen (LTO). Vereinfachung vun Typen gouf virum Resultat generéiert, wat et méiglech gemaach huet d'Gréisst vun den LTO-Objetdateien wesentlech ze reduzéieren, d'Erënnerungsverbrauch op der verbindlecher Etapp ze reduzéieren an d'Parallaliséierung vun den Operatiounen ze verbesseren. D'Zuel vun de Partitionen (-param lto-Partitionen) gouf vun 32 op 128 erhéicht, wat d'Performance op Systemer mat enger grousser Zuel vu CPU-Threads verbessert. E Parameter gouf bäigefüügt fir d'Zuel vun den Optimisatiounsprozesser ze kontrolléieren
    "-param lto-max-streaming-parallelism";

    Als Resultat, am Verglach mam GCC 8.3, sinn d'Optimisatiounen, déi am GCC 9 agefouert goufen erlaabt reduzéieren d'Kompilatiounszäit vu Firefox 5 a LibreOffice 66 ëm ongeféier 6.2.3%. D'Gréisst vun den Objektdateien ass ëm 7% erofgaang. Bindungszäit op enger 8-Kär CPU ass ëm 11% erofgaang. Déi sequentiell Optimiséierungsstadium vun der Linkstuf ass elo 28% méi séier a verbraucht 20% manner Erënnerung. Erënnerung Konsum vun all Prozessor vun der parallelized Etapp vun LTO ofgeholl vun 30%;

  • Déi meescht vun der paralleler Programméierungsspezifizéierung gëtt fir C, C++ a Fortran Sprooche implementéiert OpenACC 2.5, déi definéiert Tools fir Oflaaf Operatiounen op GPUs a spezialiséiert Prozessoren wéi NVIDIA PTX;
  • Deelweis Ënnerstëtzung fir de Standard gouf fir C an C ++ ëmgesat Open MP 5.0 (Open Multi-Processing), déi d'API a Methoden definéiert fir parallel Programméierungsmethoden fir C, C ++ a Fortran Sproochen op Multi-Core an Hybrid (CPU + GPU / DSP) Systemer mat gemeinsame Gedächtnis a Vektoriséierungsunitéiten (SIMD) anzesetzen. ;
  • Nei Warnungen goufen fir d'C Sprooch bäigefüügt: "-Waddress-vun-gepackt-Member" (net ausgeriichtte Pointerwäert op e gepackte Member vun enger Struktur oder Unioun) an
    «-Wabsolut-Wäert" (wann Zougang zu Funktiounen fir en absolute Wäert ze berechnen, wann et eng méi gëeegent Funktioun fir dat spezifizéiert Argument gëtt, zum Beispill, fabs(3.14) soll amplaz abs(3.14) benotzt ginn. Nei Warnungen dobäigesat fir C++: "-Wdeprecated-copy",
    "-Winit-Lëscht-Liewensdauer", "-Wredundant-Move", "-Wpessimizing-move" an "-Wclass-Conversion". Vill virdrun disponibel Warnungen goufen erweidert;

  • Zousätzlech experimentell Ënnerstëtzung fir en Deel vum zukünftege C Sproochestandard, Codenumm C2x. Fir C2x Support z'aktivéieren, benotzt d'Optiounen "-std=c2x" an "-std=gnu2x" (fir GNU Extensiounen z'aktivéieren). De Standard ass nach an engem fréie Stadium vun der Entwécklung, dofir, vu senge Fäegkeeten, gëtt nëmmen den Ausdrock _Static_assert mat engem Argument ënnerstëtzt (_Static_assert mat zwee Argumenter gëtt am C11 standardiséiert);
  • Ënnerstëtzung fir den C ++ 17 Standard gouf stabil deklaréiert. Am Frontend sinn d'Sproochfäegkeete vu C ++ 17 voll ëmgesat, an am libstdc ++ sinn d'Bibliothéiksfunktiounen, déi am Standard definéiert sinn, no bei der voller Ëmsetzung;
  • Weider Ëmsetzung Elementer vum zukünftege C++2a Standard. Zum Beispill ass d'Fähigkeit fir Beräicher während der Initialiséierung abegraff ze ginn, Extensiounen fir Lambda Ausdréck goufen ëmgesat, Ënnerstëtzung fir eidel Membere vun Datestrukturen a méiglecherweis / onwahrscheinlech Attributer gouf bäigefüügt, d'Fäegkeet fir virtuell Funktiounen a bedingte Ausdréck ze ruffen gouf zur Verfügung gestallt. , etc.
    Fir C++2a Ënnerstëtzung z'aktivéieren, benotzt d'Optiounen "-std=c++2a" an "-std=gnu++2a". Bitt a Versioun Header Dateien op libstdc++ fir C++2a bäigefüügt, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible an std::type_identity Charakteristiken, std::midpoint, std::lerp Funktioun , std::bind_front,
    std :: besicht, std :: is_constant_evaluated an std :: assume_aligned, dobäi Ënnerstëtzung fir den char8_t Typ, implementéiert d'Fäegkeet fir de Präfix an de Suffix vu Strings ze kontrolléieren (starts_with, ends_with);

  • Zousätzlech Ënnerstëtzung fir nei ARM Prozessoren
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE an Neoverse N1. Zousätzlech Ënnerstëtzung fir Instruktiounen, déi am Armv8.3-A agefouert goufen fir mat komplexen Zuelen ze schaffen, pseudo-zoufälleg Zuelengeneratioun (rng) a Memory Tagging (Memtag), souwéi Instruktioune fir Attacke ze blockéieren am Zesummenhang mat der spekulativer Ausféierung an der Operatioun vun der Brancheprediktioun Eenheet . Fir d'AARch64 Architektur ass e Schutzmodus bäigefüügt Kräizung vun Stack an Koup ("-fstack-clash-protection"). Fir d'Features vun der Armv8.5-A Architektur ze benotzen, ass d'Optioun "-march=armv8.5-a" bäigefüügt.

  • Et enthält e Backend fir Code fir AMD GPUs ze generéieren baséiert op der GCN Mikroarchitektur. D'Implementatioun ass am Moment limitéiert op d'Kompilatioun vun Single-threaded Uwendungen (Ënnerstëtzung fir Multi-threaded Berechnungen iwwer OpenMP an OpenACC ze maachen gëtt spéider ugebueden) an Ënnerstëtzung fir GPU Fidschi a Vega 10;
  • Neie Backend fir Prozessoren dobäigesat OpenRISC;
  • Zousätzlech Backend fir Prozessoren C-SKY V2, produzéiert vun der chinesescher Firma mam selwechten Numm fir verschidde Konsumentengeräter;
  • All Kommandozeiloptiounen déi Byte Wäerter operéieren ënnerstëtzen d'Suffixen kb, KiB, MB, MiB, GB a GiB;
  • Ëmgesat d'Optioun "-flive-patching=[inline-nëmmen-statesch|inline-klon]" erlaabt Iech sécher Kompiléierung fir Live-Patching Systemer z'erreechen wéinst Multi-Level Kontroll iwwer d'Benotzung vun interprozedural (QFont) Optimisatiounen;
  • Added "--completion" Optioun fir feinkorrekt Kontroll vun der Optioun Ofschloss wann Dir Bash benotzt;
  • D'Diagnosinstrumenter liwweren Affichage vu Quelltextauszich, déi d'Zeilnummer uginn an d'visuell Markéierung vun der Zesummenhang Informatioun, sou wéi Operand-Typen. Fir d'Affichage vun Zeilnummeren an Etiketten auszeschalten, ginn d'Optiounen "-fno-diagnostics-show-line-numbers" an "-fno-diagnostics-show-labels" ugebueden;

    Verëffentlechung vun der GCC 9 Compiler Suite

  • Erweidert Tools fir Feeler am C++ Code ze diagnostizéieren, verbessert Liesbarkeet vun Informatioun iwwer d'Ursaache vu Feeler an d'Erhiewung vu problematesch Parameteren;

    Verëffentlechung vun der GCC 9 Compiler Suite

  • Zousätzlech Optioun "-fdiagnostics-format = json", wat et erlaabt diagnostesch Ausgang am Maschinn liesbare Format (JSON) ze generéieren;
  • Nei Profiléierungsoptiounen "-fprofile-filter-Dateien" an "-fprofile-exclude-Dateien" bäigefüügt fir Quelldateien ze wielen déi veraarbecht ginn;
  • AddressSanitizer stellt Generatioun vu méi kompakt Verifizéierungscode fir automatesch Verännerlechen, wat d'Erënnerungsverbrauch vun der ausführbarer Datei reduzéiert déi iwwerpréift gëtt;
  • Verbesserte Ausgab am "-fopt-info» (detailléiert Informatiounen iwwer dobäi Optimisatiounen). Nei Präfixe bäigefüügt "optimiséiert" an "vermësst", zousätzlech zum virdru verfügbare Präfix "Notiz". Zousätzlech Ausgab vun Informatioun iwwer Entscheedung iwwer Inline-Entfaltung a Vektoriséierung vun Zyklen;
  • D'Optioun "-fsave-optimization-record" bäigefüügt, wann spezifizéiert, GCC späichert d'SRCFILE.opt-record.json.gz Datei mat enger Beschreiwung vun Entscheedungen iwwer d'Benotzung vu bestëmmten Optimisatiounen. Déi nei Optioun ënnerscheet sech vum "-fopt-info" Modus andeems zousätzlech Metadaten abegraff sinn, wéi Informatioun iwwer de Profil an Inline Ketten;
  • Zousätzlech Optiounen "-fipa-stack-alignment" an "-fipa-reference-addressable" fir d'Stackausrichtung ze kontrolléieren an d'Benotzung vun Adressmodi (nëmmen schreiwen oder liesen-exakt) fir statesch Variabelen während interprozedural Optimisatiounen;
  • Nei agebaute Funktiounen ginn agefouert fir Attributbindung ze kontrolléieren wéi och Verhalen am Zesummenhang mat Brancheprognose a spekulativ Instruktiounsausféierung: "__builtin_has_attribute«,«__builtin_expect_with_probability"an"__builtin_speculation_safe_value". En neit Attribut gouf fir Funktiounen, Variablen an Typen bäigefüügt Kopie;
  • Voll Ënnerstëtzung fir asynchronen Input / Output gouf fir d'Fortran Sprooch implementéiert;
  • Ënnerstëtzung fir Solaris 10 (*-*-solaris2.10) an Cell / BE (Cell Broadband Engine SPU) Plattforme gouf ofgeschaaft a gëtt an der nächster grousser Verëffentlechung geläscht. Ënnerstëtzung fir Armv2, Armv3, Armv5 an Armv5E Architekturen gouf gestoppt. Ënnerstëtzung fir Intel MPX (Memory Protection Extensions) gouf gestoppt.

Source: opennet.ru

Setzt e Commentaire