ΠŸΡƒΡΠΊΠ°Π½Π΅ Π½Π° компилаторния ΠΏΠ°ΠΊΠ΅Ρ‚ LLVM 9.0

Π‘Π»Π΅Π΄ ΡˆΠ΅ΡΡ‚ мСсСца Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° прСдставСни ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LLVM 9.0 β€” GCC-ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΈ инструмСнти (ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΠΈ, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅), ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‰ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π² ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ Π±ΠΈΡ‚ΠΎΠ² ΠΊΠΎΠ΄ Π½Π° RISC-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ инструкции (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина ΠΎΡ‚ ниско Π½ΠΈΠ²ΠΎ със систСма Π·Π° многостСпСнна оптимизация). ГСнСрираният псСвдокод ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ Π² машинни инструкции Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°.

НовитС характСристики Π½Π° LLVM 9.0 Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° Π·Π° СкспСримСнталСн Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΎΡ‚ Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° RISC-V ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°, ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° C++ Π·Π° OpenCL, Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° раздСлянС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ Π·Π°Ρ€Π΅Π΄Π΅Π½ΠΈ части Π² LLD ΠΈ внСдряванС Π½Π° β€žasm goto", ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² ΠΊΠΎΠ΄Π° Π½Π° ядрото Π½Π° Linux. libc++ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° WASI (систСмСн интСрфСйс Π½Π° WebAssembly), Π° LLD Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° WebAssembly.

ΠŸΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ΠΈΡ Π² Clang 9.0:

  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ ΠΎΡ‚ рСализация Π½Π° спСцифичния Π·Π° GCC ΠΈΠ·Ρ€Π°Π· "asm gotoβ€œ, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ ΠΎΡ‚ Π²Π³Ρ€Π°Π΄Π΅Π½ Π±Π»ΠΎΠΊ Π½Π° асСмблСр към Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ Π² C ΠΊΠΎΠ΄. Π’Π°Π·ΠΈ функция Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ядрото Π½Π° Linux Π² Ρ€Π΅ΠΆΠΈΠΌ β€œCONFIG_JUMP_LABEL=y” с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Clang Π½Π° систСми с x86_64 Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. ΠšΠ°Ρ‚ΠΎ сС Π²Π·Π΅ΠΌΠ°Ρ‚ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈ вСрсии, ядрото Π½Π° Linux Π²Π΅Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΎ Π² Clang Π·Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° x86_64 (ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΡˆΠ΅ само ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π·Π° arm, aarch64, ppc32, ppc64le ΠΈ mips Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ). ОсвСн Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ‚Π΅ Π·Π° Android ΠΈ ChromeOS Π²Π΅Ρ‡Π΅ са ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Clang Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ядро, Π° Google тСства Clang ΠΊΠ°Ρ‚ΠΎ основна ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ядра Π·Π° своитС производствСни Linux систСми. Π’ Π±ΡŠΠ΄Π΅Ρ‰Π΅ Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° LLVM ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² процСса Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ядрото, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ LLD, llvm-objcopy, llvm-ar, llvm-nm ΠΈ llvm-objdump;
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ СкспСримСнтална ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° C++17 Π² OpenCL. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ Π½Π° адрСсно пространство, Π±Π»ΠΎΠΊΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° адрСсно пространство Ρ‡Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ Π·Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅, прСдоставянС Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ Π² OpenCL Π·Π° C, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π° спСцифични Ρ‚ΠΈΠΏΠΎΠ²Π΅ OpenCL Π·Π° изобраТСния, ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, ΠΊΠ°Π½Π°Π»ΠΈ ΠΈ Ρ‚.Π½.
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Π½ΠΎΠ²ΠΈ Ρ„Π»Π°Π³ΠΎΠ²Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° β€ž-ftime-traceβ€œ ΠΈ β€ž-ftime-trace-granularity=Nβ€œ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ Π·Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° изпълнСниС Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΅Ρ‚Π°ΠΏΠΈ Π½Π° интСрфСйса (Π°Π½Π°Π»ΠΈΠ·, инициализация) ΠΈ Π±Π΅ΠΊΠ΅Π½Π΄Π° (Π΅Ρ‚Π°ΠΏΠΈ Π½Π° оптимизация). ΠžΡ‚Ρ‡Π΅Ρ‚ΡŠΡ‚ сС записва във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ json, ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌ с chrome://tracing ΠΈ speedscope.app;
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° спСцификатора β€ž__declspec(allocator)β€œ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ΄Ρ€ΡƒΠΆΠ°Π²Π°Ρ‰Π° информация Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, която Π²ΠΈ позволява Π΄Π° Π½Π°Π±Π»ΡŽΠ΄Π°Π²Π°Ρ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ Π² срСдата Π½Π° Visual Studio;
  • Π—Π° Π΅Π·ΠΈΠΊΠ° C Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° макроса β€ž__FILE_NAME__β€œ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π° Π½Π° макроса β€ž__FILE__β€œ, Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π²Π° само ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»Π° Π±Π΅Π· пълния ΠΏΡŠΡ‚;
  • C++ Ρ€Π°Π·ΡˆΠΈΡ€ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π·Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ Π½Π° адрСсно пространство, Π·Π° Π΄Π° ΠΎΠ±Ρ…Π²Π°Π½Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° C++, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ, Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅, ΠΈΠ·Π²ΠΎΠ΄ Π·Π° Π²ΡŠΡ€Π½Π°Ρ‚ Ρ‚ΠΈΠΏ, ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ ΠΈ Π΄Ρ€.
  • Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° OpenCL, OpenMP ΠΈ CUDA, са Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈ. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ OpenCL Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ„Π»Π°Π³ΡŠΡ‚ β€ž-fdeclare-opencl-builtinsβ€œ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½), Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ cl_arm_integer_dot_product Π΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΎ ΠΈ инструмСнтитС Π·Π° диагностика са Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈ;
  • ΠŸΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Π° Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° статичния Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° докумСнтация Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° статичСн Π°Π½Π°Π»ΠΈΠ·. Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ Ρ„Π»Π°Π³ΠΎΠ²Π΅ Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π½Π°Π»ΠΈΡ‡Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈ ΠΎΠΏΡ†ΠΈΠΈ (β€ž-analyzer-checker[-option]-helpβ€œ, β€ž-analyzer-checker[-option]-help-alphaβ€œ ΠΈ β€ž-analyzer-checker[-option]-help " -Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ"). Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ Ρ„Π»Π°Π³ "-analyzer-werror" Π·Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° прСдупрСТдСнията ΠΊΠ°Ρ‚ΠΎ Π³Ρ€Π΅ΡˆΠΊΠΈ.
    Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Π½ΠΎΠ²ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΈ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ Π½Π° опасни ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π±ΡƒΡ„Π΅Ρ€ΠΈ;
    • osx.MIGChecker Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π½Π° MIG (Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° Mach Interface Generator) ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅;
    • optin.osx.OSObjectCStyleCast Π·Π° Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ прСобразувания Π½Π° XNU libkern ΠΎΠ±Π΅ΠΊΡ‚;
    • apiModeling.llvm с Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€Π°Π½Π΅ Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΊΠΎΠ΄ΠΎΠ²Π°Ρ‚Π° Π±Π°Π·Π° Π½Π° LLVM;
    • Π‘Ρ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€Π°Π½ ΠΊΠΎΠ΄ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ C++ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ (UninitializedObject Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° optin.cplusplus);
  • ΠŸΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° clang-format Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ Π½Π° Π΅Π·ΠΈΠΊΠ° C# ΠΈ осигурява ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° стила Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΎΡ‚ Microsoft;
  • clang-cl, Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π΅Π½ интСрфСйс Π½Π° командния Ρ€Π΅Π΄, ΠΊΠΎΠΉΡ‚ΠΎ осигурява ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ Π½Π° Π½ΠΈΠ²ΠΎ ΠΎΠΏΡ†ΠΈΠΈ с ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° cl.exe, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ във Visual Studio, ΠΈΠΌΠ° Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Свристика Π·Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Π½Π΅ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΎΠΏΡ†ΠΈΠΈ Π½Π° командния Ρ€Π΅Π΄ ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ "clang-cl /diagnostic :caret /c test.cc");
  • Голяма част ΠΎΡ‚ Π½ΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бяха Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ към linter clang-tidy, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, спСцифични Π·Π° OpenMP API;
  • Π Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π½ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ clangd (Clang Server), Π² ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π΅ΠΆΠΈΠΌΡŠΡ‚ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Ρ„ΠΎΠ½ΠΎΠ² индСкс Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° контСкстуални дСйствия с ΠΊΠΎΠ΄ (ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΈ ΠΈ ΠΌΠ°ΠΊΡ€ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΠΈ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Π΅ΠΊΡ€Π°Π½ΠΈΡ€Π°Π½ΠΈ Π½ΠΈΠ·ΠΎΠ²Π΅ Π² Π½Π΅Π΅ΠΊΡ€Π°Π½ΠΈΡ€Π°Π½ΠΈ), Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ прСдупрСТдСния ΠΎΡ‚ Clang-tidy, Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½Π° диагностика Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² Π·Π°Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° информация Π·Π° йСрархията Π½Π° Ρ‚ΠΈΠΏΠ°;

ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° ΠΈΠ½ΠΎΠ²Π°Ρ†ΠΈΠΈ LLVM 9.0:

  • Към LLD Π»ΠΈΠ½ΠΊΠ΅Ρ€Π° Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° СкспСримСнтална функция Π·Π° раздСлянС, която Π²ΠΈ позволява Π΄Π° Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Π΅Π΄Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π° няколко части, всяка ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ELF Ρ„Π°ΠΉΠ». Π’Π°Π·ΠΈ функция Π²ΠΈ позволява Π΄Π° стартиратС основната част Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, която Ρ‰Π΅ Π·Π°Ρ€Π΅Π΄ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚Π΅ вградСния PDF ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Ρ„Π°ΠΉΠ», ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС Π·Π°Ρ€Π΅Π΄ΠΈ само ΠΊΠΎΠ³Π°Ρ‚ΠΎ потрСбитСлят ΠΎΡ‚Π²ΠΎΡ€ΠΈ PDF Ρ„Π°ΠΉΠ»).

    LLD Linker ΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈ Π½Π° ΠΏΡ€Π΅Π΄Π΅Π½ ΠΏΠ»Π°Π½ Π΄ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅, подходящо Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° Linux ядрото Π·Π° arm32_7, arm64, ppc64le ΠΈ x86_64 Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ.
    Нови ΠΎΠΏΡ†ΠΈΠΈ "-" (ΠΈΠ·Ρ…ΠΎΠ΄ към stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" ΠΈ β€ž-z common-page-size". Π—Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° AArch64 Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° BTI (Branch Target Indicator) ΠΈ PAC (Pointer Authentication Code) инструкции. ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π·Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ MIPS, RISC-V ΠΈ PowerPC Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Π°. Π”ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π·Π° WebAssembly;

  • Π’ libc++ изпълнСни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ssize, std::is_constant_evaluated, std::midpoint ΠΈ std::lerp, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ β€œfront” ΠΈ β€œback” са Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ към std::span, Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅ std::is_unbounded_array ΠΈ std::is_bounded_array , std Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ са Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈ: :atomic. ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π·Π° GCC 4.9 Π΅ прСустановСна (ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° с GCC 5.1 ΠΈ ΠΏΠΎ-Π½ΠΎΠ²ΠΈ вСрсии). Π”ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π‘Π―Π₯ Π›Π˜ (систСмСн интСрфСйс WebAssembly, интСрфСйс Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° WebAssembly извън Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°);
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΈ са Π½ΠΎΠ²ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° memcmp извиквания към bcmp Π² някои ситуации. Π Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ пропусканС Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π·Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Π·Π° прСскачанС, Π² ΠΊΠΎΠΈΡ‚ΠΎ Π΄ΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‰ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ са Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ инструкции, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ‚ΠΈΠΏ void;
  • Π‘Π΅ΠΊΠ΅Π½Π΄ΡŠΡ‚ Π·Π° RISC-V Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π΅ стабилизиран, ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π½Π΅ Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π½ ΠΊΠ°Ρ‚ΠΎ СкспСримСнталСн ΠΈ Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. ΠžΡΠΈΠ³ΡƒΡ€ΡΠ²Π° пълна ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ Π·Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ Π½Π° Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ инструкции RV32I ΠΈ RV64I с MAFDC Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ;
  • Бяха Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ±Ρ€ΠΎΠΉΠ½ΠΈ подобрСния Π² Π±Π΅ΠΊΠ΅Π½Π΄Π° Π·Π° X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ΠΈ PowerPC Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ. НапримСр Π·Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π°
    AArch64 Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° инструкции SVE2 (Scalable Vector Extension 2) ΠΈ MTE (Memory Tagging Extensions); Π² Π±Π΅ΠΊΠ΅Π½Π΄Π° Π½Π° ARM бСшС Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Armv8.1-M ΠΈ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ MVE (M-Profile Vector Extension). ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π·Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° GFX10 (Navi) Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° към Π±Π΅ΠΊΠ΅Π½Π΄Π° Π½Π° AMDGPU, Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ са Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΈ Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½ пропуск DPP (ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΈ с ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ).

  • Π”Π΅Π±ΡŠΠ³Π΅Ρ€ΡŠΡ‚ LLDB Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° Ρ†Π²Π΅Ρ‚Π½ΠΎ освСтяванС Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΈ слСди ΠΈ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ DWARF4 debug_types ΠΈ DWARF5 debug_info;
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΈ ΠΈ изпълними Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ COFF Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° към ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ llvm-objcopy ΠΈ llvm-strip.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€