Π Π΅Π»ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° компиляторов GCC 11

ПослС Π³ΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Ρ€Π΅Π»ΠΈΠ· свободного Π½Π°Π±ΠΎΡ€Π° компиляторов GCC 11.1, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ выпуск Π² Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ GCC 11.x. Π’ соотвСтствии с Π½ΠΎΠ²ΠΎΠΉ схСмой Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ выпусков, вСрсия 11.0 использовалась Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π° Π½Π΅Π·Π°Π΄ΠΎΠ»Π³ΠΎ Π΄ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π° GCC 11.1 ΡƒΠΆΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Π²ΠΈΠ»Π°ΡΡŒ Π²Π΅Ρ‚ΠΊΠ° GCC 12.0, Π½Π° Π±Π°Π·Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ сформирован ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· GCC 12.1.

GCC 11.1 ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»Π΅Π½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° использованиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² DWARF 5, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ стандарта C++17 («-std=gnu++17»), Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ стандарта C++20, ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ C++23, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΠΌΠΈ, связанными с Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΌ стандартом языка Π‘ΠΈ (C2x), Π½ΠΎΠ²Ρ‹ΠΌΠΈ оптимизациями ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ измСнСния:

  • Π Π΅ΠΆΠΈΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для языка C++ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π½Π° использованиС стандарта C++17 (-std=gnu++17) вмСсто Ρ€Π°Π½Π΅Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π²ΡˆΠ΅Π³ΠΎΡΡ C++14. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ повСдСния C++17 ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ шаблонов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ (-fno-new-ttp-matching).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ инструмСнта AddressSanitizer, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΊΡ‚Ρ‹ обращСния ΠΊ освобоТдённым областям памяти, Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π³Ρ€Π°Π½ΠΈΡ† Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ошибок ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. АппаратноС ускорСниС ΠΏΠΎΠΊΠ° доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ AArch64 ΠΈ сосрСдоточСно Π½Π° использованиС ΠΏΡ€ΠΈ компиляции ядра Linux. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ускорСния AddressSanitizer ΠΏΡ€ΠΈ сборкС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² пространства ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «-fsanitize=hwaddress», Π° ядра — «-fsanitize=kernel-hwaddress».
  • ΠŸΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ задСйствован Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ DWARF 5, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΌΠΈ вСрсиями ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° 25% Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Для ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ DWARF 5 трСбуСтся binutils ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ вСрсии 2.35.2. Π’ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… инструмСнтах Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ DWARF 5 поддСрТиваСтся начиная с GDB 8.0, valgrind 3.17.0, elfutils 0.172 ΠΈ dwz 0.14. Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² с использованиСм Π΄Ρ€ΡƒΠ³ΠΈΡ… вСрсий DWARF ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ «-gdwarf-2», «-gdwarf-3» ΠΈ «-gdwarf-4».
  • ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½Ρ‹ трСбования ΠΊ компиляторам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для сборки GCC. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ стандарт C++11 (Ρ€Π°Π½Π΅Π΅ трСбовался C++98), Ρ‚.Π΅. Ссли для сборки GCC 10 достаточно Π±Ρ‹Π»ΠΎ наличия GCC 3.4, Ρ‚ΠΎ для сборки GCC 11 Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ трСбуСтся ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ GCC 4.8.
  • ИзмСнСно Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² для сохранСния Π΄Π°ΠΌΠΏΠΎΠ², Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ для провСдСния LTO-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всСгда ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Ссли ΠΏΡƒΡ‚ΡŒ явно Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ «-dumpbase», «-dumpdir» ΠΈ «-save-temps=*».
  • ОбъявлСна ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ ΠΈ скоро Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° BRIG, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для использования с языком HSAIL (Heterogeneous System Architecture Intermediate Language).
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности Ρ€Π΅ΠΆΠΈΠΌΠ° ThreadSanitizer (-fsanitize=thread), ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для обнаруТСния состояния Π³ΠΎΠ½ΠΊΠΈ ΠΏΡ€ΠΈ совмСстном доступС ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½ΠΈΡ‚Π΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прилоТСния. Π’ Π½ΠΎΠ²ΠΎΠΌ выпускС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… runtime ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ инструмСнта KCSAN (Kernel Concurrency Sanitizer), ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для динамичСского выявлСния состояний Π³ΠΎΠ½ΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ядра Linux. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ «—param tsan-distinguish-volatile» ΠΈ «—param tsan-instrument-func-entry-exit».
  • НомСра столбцов Π² диагностичСских сообщСниях Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Π½Π΅ счётчик Π±Π°ΠΉΡ‚ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° строки, Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° столбцов, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ символы ΠΈ символы Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ нСсколько ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² строкС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, символ 🙂 Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ кодируСтся 4 Π±Π°ΠΉΡ‚Π°ΠΌΠΈ). Аналогично символы табуляции Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ число ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² (настраиваСтся Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ†ΠΈΡŽ -ftabstop, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 8). Для восстановлСния старого повСдСния ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° опция «-fdiagnostics-column-unit=byte», Π° для опрСдСлСния Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния (нумСрация с 0 ΠΈΠ»ΠΈ 1) — опция «-fdiagnostics-column-origin=».
  • Π’ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ обСспСчСн ΡƒΡ‡Ρ‘Ρ‚ всСго содСрТимого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° возмоТностСй, связанных с пСрСсСчСниями ΠΈ отсылками ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Π±Π»ΠΎΠΊΠ°ΠΌ Π² Π³Ρ€Π°Ρ„Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° управлСния (CFG, control-flow graph).
  • Π’ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прСобразования Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ switch сСрии условных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сравниваСтся ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ пСрСмСнная. Π’ дальнСйшСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ switch ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ инструкций Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ тСстирования (для управлСния ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция «-fbit-tests»).
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ ΠΌΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ IPA-modref (-fipa-modref) для отслСТивания ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ точности Π°Π½Π°Π»ΠΈΠ·Π°. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° рСализация ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° IPA-ICF (-fipa-icf), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сокращСно ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΡ€ΠΈ компиляции ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎ число ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСтся объСдинСниС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ IPA-CP (Interprocedural constant propagation) ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° эвристика ΠΏΠΎ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ извСстных Π³Ρ€Π°Π½ΠΈΡ† ΠΈ особСнностСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ†ΠΈΠΊΠ»ΠΎΠ².
  • Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π° этапС связывания (LTO) Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для сокращСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ скорости ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. УмСньшСно ΠΏΠΈΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти Π½Π° этапС связывания.
  • Π’ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° основС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² профилирования ΠΊΠΎΠ΄Π° (PGO — Profile-guided optimization), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° основС Π°Π½Π°Π»ΠΈΠ·Π° особСнностСй выполнСния, сокращён Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ² с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ GCOV Π·Π° счёт Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… счётчиков. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ Ρ€Π΅ΠΆΠΈΠΌ «-fprofile-values», благодаря ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡŽ большСго числа ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡ€ΠΈ косвСнных Π²Ρ‹Π·ΠΎΠ²Π°Ρ….
  • ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π° рСализация стандарта OpenMP 5.0 (Open Multi-Processing), ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ API ΠΈ способы примСнСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π½Π° многоядСрных ΠΈ Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½Ρ‹Ρ… (CPU+GPU/DSP) систСмах с ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (SIMD). Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ allocate ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования Π½Π΅ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² конструкциях OpenMP. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния OMP_TARGET_OFFLOAD.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° прСдоставляСмая для языков C, C++ ΠΈ Fortran рСализация спСцификации ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования OpenACC 2.6, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ срСдства для выноса ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (offloading) Π½Π° GPU ΠΈ спСциализированныС процСссоры, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ NVIDIA PTX.
  • Для языков сСмСйства Π‘ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½ΠΎΠ²Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «no_stack_protector», ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ слСдуСт Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ стСка («-fstack-protector»). Атрибут «malloc» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠ°Ρ€ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² для выдСлСния ΠΈ освобоТдСния памяти (allocator/deallocator), Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² статичСском Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ для опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ошибок Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти, использованиС послС освобоТдСния, Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free ΠΈ Ρ‚.ΠΏ.) ΠΈ Π² прСдупрСТдСниях компилятора «-Wmismatched-dealloc», «-Wmismatched-new-delete» ΠΈ «-Wfree-nonheap-object», ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎ нСсогласованности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ освобоТдСния ΠΈ выдСлСния памяти.
  • Для языка Π‘ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ прСдупрСТдСния:
    • «-Wmismatched-dealloc» (Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ± опСрациях освобоТдСния памяти Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½Π΅ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ с функциями выдСлСния памяти.
    • «-Wsizeof-array-div» (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ «-Wall») — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΄Π²ΡƒΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² sizeof, Ссли Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ соотвСтствуСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ элСмСнта массива.
    • «-Wstringop-overread» (Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ строковой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· области Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ массива.
    • «-Wtsan» (Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ использовании возмоТностСй (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ std::atomic_thread_fence), Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π² ThreadSanitizer.
    • «-Warray-parameter» ΠΈ «-Wvla-parameter» (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ «-Wall») — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Π½Π΅ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΌΡΡ объявлСниСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², связанных с массивами фиксированной ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.
    • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ «-Wuninitialized» Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ опрСдСляСт ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ чтСния ΠΈΠ· Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти.
    • Π’ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΈ «-Wfree-nonheap-object» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ спСктр опрСдСляСмых случаСв Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ освобоТдСния памяти с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ динамичСского выдСлСния памяти.
    • Π’ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΈ «-Wmaybe-uninitialized» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΎ выявлСниС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ области памяти.
  • Для языка Π‘ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° порция Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π² Ρ€Π°ΠΌΠΊΠ°Ρ… стандарта C2X (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ -std=c2x ΠΈ -std=gnu2x): макросы BOOL_MAX ΠΈ BOOL_WIDTH, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ указания ΠΈΠΌΡ‘Π½ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² опрСдСлСниях Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΊΠ°ΠΊ Π² C++), Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «[[nodiscard]]», ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ прСпроцСссора «__has_c_attribute», макросы FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_EXT__, INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN, DEC_INFINITY ΠΈ DEC_NAN, NaN=макросы для FloatN, _FloatNx ΠΈ _DecimalN, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π΄ΠΎ объявлСний ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ составных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².
  • Для C++ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° порция ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π², ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π² стандартС C++20, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ «consteval virtual», псСвдодСструкторы окончания ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², использованиС класса enum ΠΈ вычислСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ «new».
  • Для C++ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ, Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ стандарта C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu++2b). НапримСр, появилась ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ суффикса «zu» для Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ size_t.
  • Π’ libstdc++ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° стандарта C++17, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ появлСниС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ std::from_chars ΠΈ std::to_chars для Ρ‚ΠΈΠΏΠΎΠ² с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ элСмСнты стандарта C++20, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ std::bit_cast, std::source_location, Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ wait ΠΈ notify, <barrier>, <latch>, <semaphore>, <syncstream>, Π° Ρ‚Π°ΠΊΠΆΠ΅ элСмСнты Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ стандарта C++23 (std::to_underlying, std::is_scoped_enum). Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (SIMD, Data-Parallel Types). УскорСна рСализация std::uniform_int_distribution.
  • Бнят ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Π°Π»ΡŒΡ„Π°-качСства с libgccjit, раздСляСмой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для встраивания Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы ΠΈ использования для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ JIT-компиляции Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сборки libgccjit для MinGW.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ AArch64 Armv8-R (-march=armv8-r). Для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ AArch64 ΠΈ ARM Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° процСссоров (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ -mcpu ΠΈ -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c), Arm Cortex-X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) ΠΈ Arm Neoverse N2 (neoverse-n2). Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ CPU Fujitsu A64FX (a64fx) ΠΈ Arm Cortex-R82 (cortex-r82), ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ AArch64.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° использования SIMD-инструкций Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) ΠΈ MVE (AArch32 M-profile) для Π°Π²Ρ‚ΠΎΠ²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ… слоТСниС, Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ слоТСния/вычитания Π½Π°Π΄ комплСксными числами. Для ARM Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Π²Ρ‚ΠΎΠ²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ с использованиСм Π½Π°Π±ΠΎΡ€Π° инструкций MVE.
  • Для ARM-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ прСдоставлСн ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ встроСнных Π² компилятор Π‘ΠΈ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Intrinsics), замСняСмых Π½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ инструкции (SIMD), ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ всС инструкции NEON, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² спСцификации ACLE Q3 2020.
  • Π’ бэкСнд для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° для GPU AMD Π½Π° Π±Π°Π·Π΅ ΠΌΠΈΠΊΡ€ΠΎΠ°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ GCN Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° GPU gfx908.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΠΎΠ²Ρ‹Ρ… процСссоров ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Π½ΠΈΡ… Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π½Π°Π±ΠΎΡ€Π° инструкций:
    • Intel Sapphire Rapids (-march=sapphirerapids, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ инструкций MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 ΠΈ AVX-VNNI).
    • Intel Alderlake (-march=alderlake, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ инструкций CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI ΠΈ HRESET).
    • Intel Rocketlake (-march=rocketlake, Π°Π½Π°Π»ΠΎΠ³ Rocket Lake Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ SGX).
    • AMD Zen 3 (-march=znver3).
  • Для систСм IA-32/x86-64 Π½Π° Π±Π°Π·Π΅ процСссоров Intel Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΠΎΠ²Ρ‹Ρ… процСссорных инструкций TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„Π»Π°Π³ΠΎΠ² «-march=x86-64-v[234]» для Π²Ρ‹Π±ΠΎΡ€Π° ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86-64 (v2 — ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ SSE4.2, SSSE3, POPCNT ΠΈ CMPXCHG16B; v3 — AVX2 ΠΈ MOVBE; v4 — AVX-512).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° систСм RISC-V с порядком слСдования Π±Π°ΠΉΡ‚ «big-endian». Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция «-misa-spec=*» для Π²Ρ‹Π±ΠΎΡ€Π° вСрсии спСцификации Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π½Π°Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ RISC-V. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° AddressSanitizer ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ стСка ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠΊ.
  • ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΎ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° статичСского Π°Π½Π°Π»ΠΈΠ·Π° «-fanalyzer», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт рСсурсоёмкий ΠΌΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΏΡƒΡ‚Π΅ΠΉ выполнСния ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π Π΅ΠΆΠΈΠΌ способСн Π½Π° этапС компиляции Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠ°ΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free() для ΠΎΠ΄Π½ΠΎΠΉ области памяти, ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов, Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ освобоТдённым Π±Π»ΠΎΠΊΠ°ΠΌ памяти, использованиС Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Ρ‚.ΠΏ. Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии:
    • ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСписан ΠΊΠΎΠ΄ для отслСТивания состояния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π Π΅ΡˆΠ΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π‘ΠΈ-Ρ„Π°ΠΉΠ»ΠΎΠ².
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° C++.
    • Анализ выдСлСния ΠΈ освобоТдСния памяти абстрагирован ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ malloc ΠΈ free, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ new/delete ΠΈ new[]/delete[].
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ прСдупрСТдСния: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const ΠΈ -Wanalyzer-write-to-string-literal.
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ -fdump-analyzer-json ΠΈ -fno-analyzer-feasibility.
    • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΊ GCC (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ ΠΏΠ»Π°Π³ΠΈΠ½ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ использования глобальной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (GIL) Π² CPython).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ