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

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

Из Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй LLVM 9.0 отмСчаСтся обСспСчСниС снятия ΠΌΠ΅Ρ‚ΠΊΠΈ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ RISC-V, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° C++ для OpenCL, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ раздСлСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° динамичСски ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Π΅ части Π² LLD ΠΈ рСализация конструкции «asm goto«, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π² ΠΊΠΎΠ΄Π΅ ядра Linux. Π’ libc++ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° WASI (WebAssembly System Interface), Π° Π² LLD появилась Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° динамичСского связывания WebAssembly.

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

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° рСализация спСцифичного для GCC выраТСния «asm goto«, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΈΠ· ассСмблСрного inline-Π±Π»ΠΎΠΊΠ° ΠΊ ΠΌΠ΅Ρ‚ΠΊΠ΅ Π² ΠΊΠΎΠ΄Π΅ Π½Π° языкС Π‘ΠΈ. Указанная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для сборки ядра 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;
  • Для языка Π‘ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° макроса «__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-developer»). Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «-analyzer-werror» для рСагирования Π½Π° прСдупрСТдСния ΠΊΠ°ΠΊ Π½Π° ошибки.
    Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

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

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

  • Π’ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ LLD Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ партицирования, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° нСсколько частСй, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… размСщаСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ELF-Ρ„Π°ΠΉΠ»Π΅. Указанная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ встроСнный PDF-просмотрщик Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π» PDF-Ρ„Π°ΠΉΠ»).

    ΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ LLD Π΄ΠΎΠ²Π΅Π΄Ρ‘Π½ Π΄ΠΎ состояния, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠ³ΠΎ для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ядра 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, Π² std::span Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ «front» ΠΈ «back», Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² std::is_unbounded_array ΠΈ std::is_bounded_array, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности std::atomic. ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° GCC 4.9 (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС с GCC 5.1 ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Ρ… выпусков). Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° WASI (WebAssembly System Interface, интСрфСйс для использования WebAssembly Π²Π½Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°);
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² memcmp Π² bcmp Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ пропуск ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² для Ρ‚Π°Π±Π»ΠΈΡ† ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΠΈΠΆΠ½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ switch нСдостиТимы ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° инструкции Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ‚ΠΈΠΏΠΎΠΌ 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). Π’ бэкСнд AMDGPU Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ GFX10 (Navi), ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° возмоТности Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ DPP (Data-Parallel Primitives).

  • Π’ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ LLDB появилась цвСтная подсвСтка ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… трассировок, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±Π»ΠΎΠΊΠΎΠ² DWARF4 debug_types ΠΈ DWARF5 debug_info;
  • Π’ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ llvm-objcopy ΠΈ llvm-strip Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… ΠΈ исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ COFF.

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

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