Wydanie zestawu kompilatorów GCC 10

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.

Głównym zmiany:

  • обавлен 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.

Źródło: opennet.ru

Dodaj komentarz