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

ПослС ΡˆΠ΅ΡΡ‚ΠΈ мСсяцСв Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСдставлСн Ρ€Π΅Π»ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LLVM 12.0 — GCC-совмСстимого инструмСнтария (компиляторы, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄Π°), ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π±ΠΈΡ‚ΠΊΠΎΠ΄ RISC-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… инструкций (низкоуровнСвая Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина с ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ систСмой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ). Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ псСвдокод ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JIT-компилятора Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ инструкции нСпосрСдствСнно Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² Clang 12.0:

  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π² стандартС C++20 Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² «likely» ΠΈ «unlikely», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΎ вСроятности срабатывания условной конструкции (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «[[likely]] if (random > 0) {«).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° процСссоров AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) ΠΈ Intel Sapphire Rapids (-march=sapphirerapids).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„Π»Π°Π³ΠΎΠ² «-march=x86-64-v[234]» для Π²Ρ‹Π±ΠΎΡ€Π° ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86-64 (v2 — ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ SSE4.2, SSSE3, POPCNT ΠΈ CMPXCHG16B; v3 — AVX2 ΠΈ MOVBE; v4 — AVX-512).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° процСссоров Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) ΠΈ Fujitsu A64FX (a64fx). НапримСр, для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ для CPU Neoverse-V1 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ «-mcpu=neoverse-v1».
  • Для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ AArch64 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ компилятора «-moutline-atomics» ΠΈ «-mno-outline-atomics», ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ «__aarch64_cas8_relax». ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎ врСмя выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ LSE (Large System Extensions) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ прСдоставляСмыС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ процСссорныС инструкции ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° использованиС инструкций LL/SC (Load-link/store-conditional) для синхронизации.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция «-fbinutils-version» для Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ вСрсии Π½Π°Π±ΠΎΡ€Π° binutils для обСспСчСния совмСстимости со старым ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° ΠΈ ассСмблСра.
  • Для исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² ELF ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Ρ„Π»Π°Π³Π° «-gz» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ сТатиС ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ zlib (gz=zlib). Для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² трСбуСтся lld ΠΈΠ»ΠΈ GNU binutils 2.26+. Для восстановлСния совмСстимости со старыми вСрсиями binutils ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ «-gz=zlib-gnu».
  • Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ‘this’ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ обрабатываСтся с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ nonnull ΠΈ dereferenceable(N). Для удалСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° nonnull, ΠΏΡ€ΠΈ нСобходимости использования Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ NULL, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ «-fdelete-null-pointer-checks».
  • На ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Linux для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ AArch64 ΠΈ PowerPC Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Ρ€Π΅ΠΆΠΈΠΌ «-fasynchronous-unwind-tables» для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ «Ρ€Π°ΡΠΊΡ€ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ…» (unwind) Ρ‚Π°Π±Π»ΠΈΡ† Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΊΠ°ΠΊ Π² GCC.
  • Π’ «#pragma clang loop vectorize_width» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания ΠΎΠΏΡ†ΠΈΠΉ «fixed» (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) ΠΈ «scalable» для Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π Π΅ΠΆΠΈΠΌ «scalable», нСзависимый ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, являСтся ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠΈ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Windows: ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ сборки для Windows Π½Π° систСмах Arm64, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ компилятор Clang, ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ LLD ΠΈ runtime-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ compiler-rt. ΠŸΡ€ΠΈ сборкС для Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ MinGW Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ суффикса .exe, Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ кросс-компиляции.
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности, связанныС с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ OpenCL, OpenMP ΠΈ CUDA. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΎΠΏΡ†ΠΈΠΈ «-cl-std=CL3.0» ΠΈ «-cl-std=CL1.0» для Π²Ρ‹Π±ΠΎΡ€Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² макросов для OpenCL 3.0 ΠΈ OpenCL 1.0. Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ срСдства диагностики.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° инструкций HRESET, UINTR ΠΈ AVXVNNI, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… процСссорах Π½Π° Π±Π°Π·Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86.
  • На систСмах x86 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠΏΡ†ΠΈΠΈ «-mtune=<cpu>», Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ ΠΌΠΈΠΊΡ€ΠΎΠ°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, нСзависимо ΠΎΡ‚ значСния «-march=<cpu>».
  • Π’ статичСском Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… POSIX-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° условных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² сравнСнии Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ: fuchia.HandleChecker (опрСдСляСт дСскрипторы Π² структурах), webkit.UncountedLambdaCapturesChecker webkit ΠΈ alpha.webkit.UncountedLocalVarsChecker (ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ особСнности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с указатСлями Π² ΠΊΠΎΠ΄Π΅ Π΄Π²ΠΈΠΆΠΊΠ° WebKit).
  • Π’ выраТСниях, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² контСкстС констант, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ использованиС встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, __bswapq, _castf*, __rol* ΠΈ __ror*.
  • Π’ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ clang-format Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция BitFieldColonSpacing для Π²Ρ‹Π±ΠΎΡ€Π° расстановки ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², столбцов ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»Π΅ΠΉ.
  • Π’ ΠΊΠ΅ΡˆΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ сСрвСрС clangd (Clang Server) Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Linux Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сокращСно ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΡ€ΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ (обСспСчСн пСриодичСский Π²Ρ‹Π·ΠΎΠ² malloc_trim для ΠΎΡ‚Π΄Π°Ρ‡ΠΈ свободных страниц памяти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС).

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Π° LLVM 12.0:

  • ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° написанного Π½Π° языкС Python сборочного инструмСнтария llvm-build, вмСсто ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΡˆΡ‘Π» Π½Π° использованиС сборочной систСмы CMake.
  • Π’ бэкСндС для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ AArch64 ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Windows: обСспСчСна коррСктная гСнСрация ассСмблСрного Π²Ρ‹Π²ΠΎΠ΄Π° для Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… систСм Windows, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° гСнСрация Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ «Ρ€Π°ΡΠΊΡ€ΡƒΡ‚ΠΊΠ΅» (unwind) Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… сократился Π½Π° 60%), Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания unwind-Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ассСмблСрных Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² .seh_*.
  • Π’ бэкСндС для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ PowerPC Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ inline-развёртывания, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° процСссоров Power10, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° инструкций MMA для манипуляций с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы AIX.
  • Π’ бэкСндС для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° процСссоров AMD Zen 3, Intel Alder Lake ΠΈ Intel Sapphire Rapids, Π° Ρ‚Π°ΠΊΠΆΠ΅ процСссорных инструкций HRESET, UINTR ΠΈ AVXVNNI. ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ MPX (Memory Protection Extensions) для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° соблюдСниС Π³Ρ€Π°Π½ΠΈΡ† областСй памяти (указанная тСхнология Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° распространСния ΠΈ ΡƒΠΆΠ΅ ΡƒΠ΄Π°Π»Π΅Π½Π° ΠΈΠ· GCC ΠΈ clang). Π’ ассСмблСр Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прСфиксов {disp32} ΠΈ {disp8} ΠΈ суффиксов .d32 ΠΈ .d8 для управлСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ смСщСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ². Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «tune-cpu» для управлСния Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΈΠΊΡ€ΠΎΠ°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ.
  • Π’ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами (integer sanitizer, «-fsanitize=integer») Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ «-fsanitize=unsigned-shift-base» для выявлСния ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл послС Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Π²Π»Π΅Π²ΠΎ.
  • Π’ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π°Ρ… (asan, cfi, lsan, msan, tsan, ubsan sanitizer) Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Linux-дистрибутивов с стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Musl.
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° LLD. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ELF, Π² Ρ‚ΠΎΠΌ числС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΎΠΏΡ†ΠΈΠΈ «—dependency-file», «—error-handling-script», «—lto-pseudo-probe-for-profiling», «—no-lto-whole-program-visibility». Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° MinGW. Для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Mach-O (macOS) Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ arm64, arm ΠΈ i386, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π° этапС связывания (LTO) ΠΈ раскрутки стСка ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.
  • Π’ Libc++ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ возмоТности стандарта C++20 ΠΈ Π½Π°Ρ‡Π°Π»Π°ΡΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° возмоТностСй спСцификации C++2b. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сборки с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ («-DLIBCXX_ENABLE_LOCALIZATION=OFF») ΠΈ устройств для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ псСвдо-случайных чисСл («-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF»).

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