Wydanie zestawu kompilatorów GCC 12

Po roku prac wydano darmowy pakiet kompilatorów GCC 12.1, pierwsze znaczące wydanie w nowej gałęzi GCC 12.x. Zgodnie z nowym schematem numeracji wydań, w procesie rozwoju wykorzystano wersję 12.0, a na krótko przed wydaniem GCC 12.1, gałąź GCC 13.0 już się rozgałęziła, na bazie której powstanie kolejne główne wydanie, GCC 13.1. formować się. 23 maja projekt będzie obchodził 35. rocznicę powstania pierwszej edycji GCC.

Główne zmiany:

  • Dodano obsługę formatu debugowania CTF (Compact Type Format), który zapewnia kompaktowe przechowywanie informacji o typach C, połączeniach między funkcjami i symbolach debugowania. Po osadzeniu w obiektach ELF format umożliwia użycie tablic znaków EFL w celu uniknięcia powielania danych.
  • Obsługa formatu przechowywania informacji debugowania „STABS”, stworzonego w latach 1980. XX wieku, jest przestarzała.
  • Trwają prace nad rozszerzeniem obsługi przyszłych standardów C2X i C++23 dla języków C i C++. Na przykład dodano obsługę wyrażenia „if consteval”; wolno używać auto w argumentach funkcji („f(auto(g()))”); użycie zmiennych nieliteralnych, goto i etykiet jest dozwolone w funkcjach zadeklarowanych jako constexpr; dodano obsługę wielowymiarowych operatorów indeksowych operator[]; in if, for i switch rozszerzono możliwości bloków inicjujących („for ( using T = int; Te : v)”).
  • Biblioteka standardowa C++ poprawiła obsługę eksperymentalnych sekcji standardów C++ 20 i C++ 23. Dodano obsługę std::move_only_function, , std::basic_string::resize_and_overwrite, , i std::invoke_r. Zezwolono na użycie std::unique_ptr, std::vector, std::basic_string, std::opcjonalne i std::variant w funkcjach constexpr.
  • Frontend Fortran zapewnia pełną obsługę specyfikacji TS 29113, która opisuje możliwości zapewnienia przenośności pomiędzy Fortranem a kodem C.
  • Dodano obsługę rozszerzenia __builtin_shufflevector(vec1, vec2, indeks1, indeks2, ...) dodanego wcześniej do Clang, które oferuje pojedyncze wywołanie w celu wykonania typowych operacji tasowania wektorów i tasowania.
  • Podczas korzystania z poziomu optymalizacji „-O2” wektoryzacja jest domyślnie włączona (włączone są tryby -ftree-vectorize i -fvect-cost-model=bardzo tanie). Bardzo tani model pozwala na wektoryzację tylko wtedy, gdy kod wektorowy może całkowicie zastąpić wektoryzowany kod skalarny.
  • Dodano tryb „-ftrivial-auto-var-init”, aby umożliwić jawną inicjalizację zmiennych na stosie w celu śledzenia problemów i blokowania luk w zabezpieczeniach związanych z użyciem niezainicjowanych zmiennych.
  • Dla języków C i C++ dodano wbudowaną funkcję __builtin_dynamic_object_size służącą do określenia rozmiaru obiektu, zgodną z podobną funkcją firmy Clang.
  • Dla języków C i C++ dodano obsługę atrybutu „niedostępny” (można np. zaznaczyć funkcje, które przy próbie ich użycia wygenerują błąd).
  • Dla języków C i C++ dodano obsługę dyrektyw przetwarzania wstępnego „#elifdef” i „#elifndef”.
  • Dodano flagę „-Wbidi-chars”, aby wyświetlić ostrzeżenie w przypadku nieprawidłowego użycia znaków UTF-8, zmieniając kolejność wyświetlania tekstu dwukierunkowego.
  • Dodano flagę „-Warray-compare”, aby wyświetlić ostrzeżenie podczas próby porównania dwóch operandów odnoszących się do tablic.
  • Implementacja standardów OpenMP 5.0 i 5.1 (Open Multi-Processing), które definiują 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) , trwało.
  • Ulepszona implementacja specyfikacji programowania równoległego OpenACC 2.6, która definiuje narzędzia do odciążania operacji na procesorach graficznych i wyspecjalizowanych procesorach, takich jak NVIDIA PTX.
  • Do backendu generowania kodu dla architektury x86 dodano obsługę rozszerzonych instrukcji Intel AVX512-FP16 i typu _Float16.
  • Dla architektury x86 dodano ochronę przed lukami w procesorach spowodowanymi spekulatywnym wykonaniem instrukcji po operacjach bezwarunkowego skoku do przodu. Problem występuje w wyniku wyprzedzającego przetwarzania instrukcji bezpośrednio po instrukcji rozgałęzienia w pamięci (SLS, Straight Line Speculation). Aby włączyć ochronę, zaproponowano opcję „-mharden-sls”.
  • Dodano wykrywanie użycia niezainicjowanych zmiennych do eksperymentalnego analizatora statycznego. Dodano początkową obsługę analizowania kodu zestawu we wstawkach wbudowanych. Ulepszone śledzenie pamięci. Kod przetwarzania wyrażeń przełączających został przepisany.
  • Dodano 30 nowych wywołań do libgccjit, współdzielonej biblioteki służącej do osadzania generatora kodu w innych procesach i używania go do kompilacji kodu bajtowego w JIT do kodu maszynowego.
  • Do backendu dodano obsługę mechanizmu CO-RE (Compile Once - Run Everywhere) służącego do generowania kodu bajtowego BPF, który umożliwia jednorazową kompilację kodu programów eBPF dla jądra Linuksa i wykorzystanie specjalnego uniwersalnego modułu ładującego, który dostosowuje załadowany program do bieżącego jądra i formatu typów BPF). CO-RE rozwiązuje problem przenośności skompilowanych programów eBPF, które dotychczas można było wykorzystać jedynie w tej wersji jądra, dla której zostały skompilowane, gdyż położenie elementów w strukturach danych zmienia się z wersji na wersję.
  • Backend RISC-V dodaje obsługę nowych rozszerzeń architektury zestawu instrukcji zba, zbb, zbc i zbs, a także rozszerzeń ISA dla operacji kryptograficznych wektorowych i skalarnych. Domyślnie zapewniona jest obsługa specyfikacji RISC-V ISA 20191213. Dodano flagę -mtune=thead-c906, aby umożliwić optymalizację dla rdzeni T-HEAD c906.
  • Do backendu generowania kodu dla procesorów graficznych AMD w oparciu o mikroarchitekturę GCN dodano obsługę typu __int128_t/integer(kind=16). Możliwe jest użycie do 40 grup roboczych na jednostkę obliczeniową (CU) i do 16 frontów instrukcji (czoło fali, zestaw wątków wykonywanych równolegle przez silnik SIMD) na grupę. Wcześniej dozwolona była tylko jedna krawędź instrukcji na jednostkę CU.
  • Backend NVPTX, zaprojektowany do generowania kodu przy użyciu architektury zestawu instrukcji NVIDIA PTX (Parallel Thread Execution), dodał możliwość używania flag „-march”, „-mptx” i „-march-map”. Zaimplementowano obsługę PTX ISA sm_53, sm_70, sm_75 i sm_80. Domyślna architektura to sm_30.
  • W backendie dla procesorów PowerPC / PowerPC64 / RS6000 przepisano implementacje wbudowanych funkcji. Wbudowane funkcje __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar i __builtin_set_tfiar są udokumentowane.
  • Obsługa Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) i Arm Cortex-X710 (cortex-x2). Dodano obsługę nowych opcji architektury ARMv2 do użycia z opcją „-march”: armv8-a, armv8.7-a, armv8.8-a. Dodano implementację funkcji C wbudowanych w kompilator (Intrinsics) do atomowego ładowania i zapisywania danych do pamięci, w oparciu o wykorzystanie rozszerzonych instrukcji ARM (ls9). Dodano obsługę przyspieszania funkcji memcpy, memmove i memset przy użyciu rozszerzenia ARM mopoption.
  • Dodano nowy tryb sprawdzania „-fsanitize=shadow-call-stack” (ShadowCallStack), który jest obecnie dostępny tylko dla architektury AArch64 i działa podczas budowania kodu z opcją „-fixed-r18”. Tryb zapewnia zabezpieczenie przed nadpisaniem adresu zwrotnego z funkcji w przypadku przepełnienia bufora na stosie. Istotą zabezpieczenia jest zapisanie adresu zwrotnego na osobnym stosie „cienia” po przekazaniu sterowania do funkcji i odzyskaniu tego adresu przed wyjściem z funkcji.

Źródło: opennet.ru

Dodaj komentarz