Po roku rozwoju opublikowany wydanie darmowego zestawu kompilatorów GCC 10.1, pierwsze główne wydanie w nowej gałęzi GCC 10.x. Zgodnie z nowy schemat numerów wydań, w procesie rozwoju wykorzystano wersję 10.0, a na krótko przed wydaniem GCC 10.1, gałąź GCC 11.0 już się oddzieliła, na bazie której powstanie kolejne znaczące wydanie, GCC 11.1.
GCC 10.1 wyróżnia się implementacją wielu innowacji w języku C++ opracowanym dla standardu C++20, ulepszeniami związanymi z przyszłym standardem języka C (C2x), nowymi optymalizacjami w backendach kompilatora i wsparciem eksperymentalnym tryb analizy statycznej. Dodatkowo w trakcie przygotowywania nowego oddziału w ramach projektu przeniesiono repozytorium z SVN do Git.
обавлен eksperymentalny tryb analizy statycznej”-fanalizator„, który wykonuje wymagającą dużej ilości zasobów analizę międzyproceduralną ścieżek wykonania kodu i przepływów danych w programie. Tryb jest w stanie wykryć problemy na etapie kompilacji, takie jak podwójne wywołania funkcji free() dla jednego obszaru pamięci, wycieki deskryptorów plików, wyłuskiwanie i przekazywanie wskaźników zerowych, dostęp do zwolnionych bloków pamięci, używanie niezainicjowanych wartości itp. Zastosowanie nowego trybu dla kodu OpenSSL umożliwiło już identyfikację niebezpieczna luka.
Ulepszone optymalizacje międzyproceduralne. Przepustka IPA-SRA (Interprocedural Scalar Shared Wymiana) została przeprojektowana tak, aby działała w czasie wiązania i między innymi usuwa teraz obliczone i zwrócone nieużywane wartości. W trybie optymalizacji „-O2” włączona jest opcja „-finline-functions”, która jest ponownie dostrajana tak, aby faworyzować bardziej zwarty kod w stosunku do wydajności wykonywania. Przyspieszono pracę heurystyki przy wdrażaniu funkcji inline. Heurystyki ekspansji wbudowanej i klonowania funkcji mogą teraz wykorzystywać informacje o zakresach wartości do przewidywania skuteczności poszczególnych transformacji. W przypadku języka C++ poprawiono dokładność analizowania aliasów w oparciu o typy.
Ulepszone optymalizacje czasu łączenia (LTO). Dodano nowy plik wykonywalny lto-zrzut aby zresetować informacje o plikach obiektowych za pomocą kodu bajtowego LTO. Równoległe przebiegi LTO automatycznie określają liczbę jednocześnie uruchomionych zadań make i, jeśli nie można ich określić, wykorzystują informację o liczbie rdzeni procesora jako współczynnik zrównoleglenia. Dodano możliwość kompresji kodu bajtowego LTO przy użyciu algorytmu zstd.
Udoskonalono mechanizm optymalizacji bazujący na wynikach profilowania kodu (PGO - Profile-guided optymalizacji), który generuje bardziej optymalny kod na podstawie analizy charakterystyk wykonania kodu. Ulepszona obsługa profili podczas kompilacji i separacji kodu gorącego/zimnego. Za pomocą opcji „-f-wartości-profilu» może teraz monitorować do 4 wartości profilu, na przykład dla połączeń pośrednich i dostarczać bardziej precyzyjnych informacji o profilu.
Specyfikacja programowania równoległego zaimplementowana dla języków C, C++ i Fortran OpenACC 2.6, który definiuje narzędzia do odciążania operacji na procesorach graficznych i wyspecjalizowanych procesorach, takich jak NVIDIA PTX. Wdrożenie standardu jest już prawie ukończone Otwarte MP 5.0 (Open Multi-Processing), który definiuje API i metody stosowania metod programowania równoległego na systemach wielordzeniowych i hybrydowych (CPU+GPU/DSP) z pamięcią współdzieloną i jednostkami wektoryzacji (SIMD). Dodano funkcje, takie jak warunki warunkowe lastprivate, dyrektywy skanowania i pętli, wyrażenia kolejności i use_device_addr. W przypadku OpenMP i OpenACC dodano obsługę operacji odciążania na procesorach graficznych AMD Radeon (GCN) czwartej generacji (Fidżi) i piątej generacji (VEGA 10/VEGA 20).
Dla języków z rodziny C dodano funkcję „access” opisującą dostęp funkcji do obiektów przekazywanych przez referencję lub wskaźnik oraz kojarzącą takie obiekty z argumentami całkowitymi zawierającymi informację o wielkości obiektów. Aby działać w połączeniu z „dostępem”, zaimplementowano atrybut „typ” w celu wykrywania nieprawidłowego dostępu z funkcji użytkownika, na przykład podczas zapisywania wartości w obszarze poza granicami tablicy. Dodano także atrybut „symver”, który umożliwia powiązanie symboli w pliku ELF z określonymi numerami wersji.
Dodano nowe ostrzeżenia:
„-Wstring-compare” (włączone z „-Wextra”) - ostrzega o obecności wyrażeń, w których porównywane jest zero z wynikiem wywołania funkcji strcmp i strncmp, co jest równoważne stałej ze względu na fakt, że długość jednego argumentu jest większy niż rozmiar tablicy w drugim argumencie.
"-Wzero-length-bounds" (włączone z "-Warray-bounds") - ostrzega o dostępie do elementów tablicy o zerowej długości, co może skutkować nadpisaniem innych danych.
Ostrzeżenia „-Warray-bounds”, „-Wformat-overflow”, „-Wrestrict”, „-Wreturn-local-addr” i „-Wstringop-overflow” zostały rozszerzone, aby zwiększyć liczbę sytuacji przekroczenia zakresu które są obsługiwane.
Zaimplementowano możliwość bezpośredniego określania rozszerzonych znaków w identyfikatorach przy użyciu bieżącego kodowania (domyślnie UTF-8), a nie notacji UCN (\uNNNN lub \UNNNNNNNN). Na przykład:
stała statyczna int π = 3;
int get_naïve_pi() {
zwróć π;
}
Dla języka C zaimplementowano część nowych funkcjonalności opracowanych w ramach standardu C2X (włączonych poprzez podanie -std=c2x i -std=gnu2x): pojawiła się obsługa składni „[[]]” przy definiowaniu atrybutów jak w C++ (na przykład [[gnu ::const]], [[przestarzałe]], [[fallthrough]] i [[maybe_unused]]. Dodano obsługę składni „u8” do definiowania stałych ze znakami UTF-8.
Dodano nowe makra do . Dodano podstawienia „%OB” i „%Ob” do strftime.
Domyślnym trybem dla C jest „-fno-common”, który pozwala na bardziej efektywny dostęp do zmiennych globalnych na niektórych platformach.
Dla C++ zaimplementowano około 16 zmian i innowacji, opracowanych w standardzie C++20. Zawiera dodane słowo kluczowe „constinit”
i zaimplementowano obsługę rozszerzeń szablonów”koncepcja„. Koncepcje umożliwiają zdefiniowanie zestawu wymagań dotyczących parametrów szablonu, które w czasie kompilacji ograniczają zestaw argumentów, które można zaakceptować jako parametry szablonu. Pojęcia te można wykorzystać, aby uniknąć logicznych niespójności między właściwościami typów danych używanych w szablonie a właściwościami typu danych parametrów wejściowych.
G++ zapewnia wykrywanie niezdefiniowanego zachowania spowodowanego zmianą obiektów stałych poprzez constexpr. Zmniejszone zużycie pamięci przez kompilator podczas obliczania constexpr. Dodano nowe ostrzeżenia „-Wmismatched-tags” i „-Wredundant-tags”.
Zaproponowano nowe opcje wiersza poleceń:
„-falllocation-dce”, aby usunąć niepotrzebne pary operatorów „nowy” i „usuń”.
„-fprofile-partial-training”, aby wyłączyć optymalizację rozmiaru kodu, który nie został poddany przebiegowi szkoleniowemu.
"-fprofile-reproducible, aby kontrolować poziom odtwarzalności profilu.
„-fprofile-prefix-path” do zdefiniowania podstawowego katalogu źródłowego kompilacji używanego do oddzielnego generowania profili (dla „-fprofile-generate=katalog_profilu” i „-fprofile-use=katalog_profilu”).
W tekście ostrzeżenia dotyczącym wspomnianych opcji znajdują się hiperłącza umożliwiające przejście do dokumentacji tych opcji. Podstawianie adresów URL kontrolowane jest za pomocą opcji „-fdiagnostics-urls”.
Dodano operator preprocesora „__ma_wbudowany", którego można użyć do sprawdzenia wbudowanych funkcji.
Dodano nową wbudowaną funkcję „__builtin_roundeven” z implementacją funkcji zaokrąglania zdefiniowanej w specyfikacji ISO/IEC TS 18661, podobnej do „round”, ale zaokrąglającej część większą niż 0.5 w górę (do większej wartości), mniejszą niż 0.5 - w dół (do zera) i równy 0.5 - zaczynając od parzystości przedostatniej cyfry.
Dla architektury AArch64 dodano obsługę rozszerzenia SVE2 i poprawiono obsługę SVE (Scalable Vector Extension), w tym dodano obsługę wbudowanych funkcji i typów SVE ACLE oraz wykorzystanie wektoryzacji. Rozszerzono obsługę LSE (Large System Extensions) i TME (Transactional Memory Extension). Dodano nowe instrukcje zaproponowane w Armv8.5-A i Armv8.6-A, w tym instrukcje dotyczące generowania liczb losowych, zaokrąglania, wiązania znaczników pamięci,
bfloat16 i mnożenie macierzy. Dodano obsługę procesorów
Kora ramienia-A77,
Kora ramienia-A76AE,
Kora ramienia-A65,
Kora ramienia-A65AE,
Ramię Cortex-A34 i
Marvell ThunderX3.
Dodano obsługę ABI FDPIC (32-bitowe wskaźniki funkcji) dla ARM64. Przeprojektowane i zoptymalizowane przetwarzanie 64-bitowych operacji na liczbach całkowitych. Dodano obsługę procesora
Kora ramienia-A77,
Ramię Cortex-A76AE i
Ramię Cortex-M35P. Rozszerzona obsługa instrukcji przetwarzania danych ACLE, w tym 32-bitowa SIMD, 16-bitowe mnożenie, arytmetyka zatrzaskowa i inne optymalizacje algorytmu DSP. Dodano eksperymentalną obsługę instrukcji ACLE CDE (Custom Datapath Extension).
Znacząco ulepszone generowanie kodu i wektoryzacja w backendie dla procesorów graficznych AMD opartych na mikroarchitekturze GCN.
Dodano obsługę urządzeń typu XMEGA dla architektury AVR
ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609 3208, ATmega3209, ATmega4808 4809, ATmegaXNUMX i ATmegaXNUMX.
Dodano nowe rozszerzenie architektury zestawu instrukcji Intel ENQCMD (-menqcmd) dla architektur IA-32/x86-64. Dodano obsługę procesorów Intel Cooperlake (-march=cooperlake, zawiera rozszerzenie AVX512BF16 ISA) i Tigerlake (-march=tigerlake, zawiera rozszerzenia MOVDIRI, MOVDIR64B i AVX512VP2INTERSECT ISA).
Implementacja języka HSAIL (Heterogeneous System Architecture Intermediate Language) dla heterogenicznych systemów komputerowych opartych na architekturze HSA jest przestarzała i prawdopodobnie zostanie usunięta w przyszłej wersji.