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

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

Из Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй LLVM 10.0 отмСчаСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ C++ (C++ Concepts), ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ запуска Clang Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ процСсса, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ CFG (control flow guard) для Windows ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй CPU.

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

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° «ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ«, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ шаблонов C++, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² состав ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ стандарта, Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ C++2a (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ„Π»Π°Π³ΠΎΠΌ -std=c++2a).
    ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ шаблона, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎ врСмя компиляции ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ логичСских нСсоотвСтствий ΠΌΠ΅ΠΆΠ΄Ρƒ свойствами Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ шаблона, ΠΈ свойствами Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

    template<typename T>
    concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Ρ‘Π½ запуск ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ процСсса («clang -cc1»), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся компиляция. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выполняСтся Π² основном процСссС, Π° для восстановлСния старого повСдСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ «-fno-integrated-cc1».
  • НовыС Ρ€Π΅ΠΆΠΈΠΌΡ‹ диагностики:
    • «-Wc99-designator» ΠΈ «-Wreorder-init-list» — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‚ ΠΎΠ± использовании ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² C99 Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ C++ Π² случаях, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ Π² C99, Π½ΠΎ Π½Π΅ подходят для C++20.
    • «-Wsizeof-array-div» — ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ ситуации, ΠΊΠ°ΠΊ «int arr[10]; …sizeof(arr) / sizeof(short)…» (Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ «sizeof(arr) / sizeof(int)»).
    • «-Wxor-used-as-po» — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ± использовании Ρ‚Π°ΠΊΠΈΡ… конструкций, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° «^» (xor) Π² опСрациях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡƒΡ‚Π°Ρ‚ΡŒ с Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ (2 ^ 16).
    • «-Wfinal-dtor-non-final-class» — ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ классах, Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… спСцификатором «final», Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… дСструктор c ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ «final».
    • «-Wtautological-bitwise-compare» — Π³Ρ€ΡƒΠΏΠΏΠ° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ для диагностики тавтологичСского сравнСния Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ константы, Π° Ρ‚Π°ΠΊΠΆΠ΅ для выявлСния всСгда истинных сравнСний, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… битовая опСрация OR примСняСтся ΠΊ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ числу.
    • «-Wbitwise-conditional-parentheses» ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… ΠΏΡ€ΠΈ смСшивании логичСских ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² AND («&») ΠΈ OR («|») c условным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ («?:»).
    • «-Wmisleading-indentation» — Π°Π½Π°Π»ΠΎΠ³ ΠΎΠ΄Π½ΠΎΠΈΠΌΡ‘Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠ· GCC, ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ ΠΎ выраТСниях, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… отступом, Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ΠΈ входят Π² Π±Π»ΠΎΠΊ if/else/for/while, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π² Π΄Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π½Π΅ входящих.
    • ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ «-Wextra» обСспСчСно Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ «-Wdeprecated-copy», ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ ΠΎΠ± использовании конструкторов
      «move» ΠΈ «copy» Π² классах с явным ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ дСструктора.

    • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ «-Wtautological-overlap-compare», «-Wsizeof-pointer-div», «-Wtautological-compare», «-Wrange-loop-analysis».
    • ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ «-Wbitwise-op-parentheses» ΠΈ «-Wlogical-op-parentheses».
  • Π’ ΠΊΠΎΠ΄Π΅ Π½Π° Π‘ ΠΈ Π‘++ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с указатСлями Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² массивах. Π”Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ повСдСния (Undefined Behavior Sanitizer) Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ «-fsanitize=pointer-overflow» Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ случаи, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ смСщСния ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ null ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ указатСля ΠΏΡ€ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠΈ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа ΠΈΠ· Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ указатСля.
  • Π Π΅ΠΆΠΈΠΌ «-fsanitize=implicit-conversion» (Implicit Conversion Sanitizer) Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ для выявлСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с опСрациями ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° для Ρ‚ΠΈΠΏΠΎΠ² с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ мСньшим, Ρ‡Π΅ΠΌ Ρƒ Ρ‚ΠΈΠΏΠ° «int».
  • ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… x86-Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ «-march=skylake-avx512», «-march=icelake-client», «-march=icelake-server», «-march=cascadelake» ΠΈ «-march=cooperlake» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΎ использованиС 512-разрядных рСгистров zmm, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡ… прямого указания Π² исходных тСкстах. ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ являСтся сниТСниС частоты CPU ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ 512-разрядных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Для измСнСния Π½ΠΎΠ²ΠΎΠ³ΠΎ повСдСния прСдусмотрСна опция «-mprefer-vector-width=512».
  • ПовСдСниС Ρ„Π»Π°Π³Π° «-flax-vector-conversions» ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΎ ΠΊ GCC: Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹ нСявныС Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ цСлочислСнными Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. Для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ограничСния прСдлагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³
    «-flax-vector-conversions=all», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CPU MIPS сСмСйства Octeon. Π’ список допустимых Ρ‚ΠΈΠΏΠΎΠ² CPU Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ «octeon+».
  • ΠŸΡ€ΠΈ сборкС Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ WebAssembly обСспСчСн автоматичСский Π²Ρ‹Π·ΠΎΠ² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° wasm-opt, ΠΏΡ€ΠΈ Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² систСмС.
  • Для систСм Π½Π° Π±Π°Π·Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ RISC-V Π² условных Π±Π»ΠΎΠΊΠ°Ρ… ассСмблСрных inline-вставок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ использованиС рСгистров, хранящих значСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ компилятора: «-fgnuc-version» для задания значСния вСрсии для «__GNUC__» ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… макросов; «-fmacro-prefix-map=OLD=NEW» для Π·Π°ΠΌΠ΅Π½Ρ‹ прСфикса ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² OLD Π½Π° NEW Π² Ρ‚Π°ΠΊΠΈΡ… макросах, ΠΊΠ°ΠΊ «__FILE__»; «-fpatchable-function-entry=N[,M]» для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ числа инструкций NOP ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ послС Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π²Ρ…ΠΎΠ΄Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Для RISC-V
    Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„Π»Π°Π³ΠΎΠ² «-ffixed-xX», «-mcmodel=medany» ΠΈ «-mcmodel=medlow».

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ‘__attribute__((target(«branch-protection=…»)))’, дСйствиС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΎΠΏΡ†ΠΈΠΈ -mbranch-protection.
  • На ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Windows ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Ρ„Π»Π°Π³Π° «-cfguard» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° подстановка ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ цСлостности ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния (Control Flow Guard) ΠΏΡ€ΠΈ нСпрямых Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ подстановки ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ «-cfguard-nochecks» ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ «__declspec(guard(nocf))».
  • ПовСдСниС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° gnu_inline ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΎ ΠΊ GCC, Π² случаях, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±Π΅Π· ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова «extern».
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности, связанныС с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ OpenCL ΠΈ CUDA. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй OpenMP 5.0.
  • Π’ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ clang-format Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция Standard, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ стандарта C++, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° (Latest, Auto, c++03, c++11, c++14, c++17, c++20).
  • Π’ статичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ: alpha.cplusplus.PlacementNew для опрСдСлСния достаточного мСста Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, fuchsia.HandleChecker для выявлСния ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ, связанных с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Fuchsia, security.insecureAPI.decodeValueOfObjCType для опрСдСлСния ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€Π° ΠΏΡ€ΠΈ использовании [NSCoder decodeValueOfObjCType:at:].
  • Π’ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π΅ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ повСдСния (UBSan, Undefined Behavior Sanitizer) Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пСрСполнСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… смСщСний ΠΊ указатСлям NULL ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ добавлСния смСщСния указатСля со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ NULL.
  • Π’ linter clang-tidy Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° большая порция Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ.

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

  • Π’ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Attributor Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΎ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ состояния 19 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ 12 Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² 12 LLVM IR ΠΈ 7 абстрактных Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΆΠΈΠ²ΡƒΡ‡Π΅ΡΡ‚ΡŒ (liveness).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ встроСнныС Π² компилятор ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ матСматичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Intrinsics), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ компиляции Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° эффСктивныС Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ инструкции.
  • ВнСсСны многочислСнныС ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² бэкСнды для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ΠΈ PowerPC. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 ΠΈ Neoverse N1. Для ARMv8.1-M ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ процСсс Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, появилась ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ†ΠΈΠΊΠ»ΠΎΠ² с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ расходами) ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Π²Ρ‚ΠΎΠ²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ с использованиСм Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ MVE. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CPU MIPS Octeon. Для PowerPC Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° вСкторизация матСматичСских ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ MASSV (Mathematical Acceleration SubSystem), ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° гСнСрация ΠΊΠΎΠ΄Π° ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ доступ ΠΊ памяти ΠΈΠ· Ρ†ΠΈΠΊΠ»ΠΎΠ². Для x86 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² v2i32, v4i16, v2i16, v8i8, v4i8 ΠΈ v2i8.

  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° для WebAssembly. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° TLS (Thread-Local Storage) ΠΈ инструкции atomic.fence. Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° SIMD. Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… WebAssembly Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования сигнатур Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с нСсколькими значСниями.
  • ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ†ΠΈΠΊΠ»ΠΎΠ² задСйствован Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ MemorySSA, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ опСрациями с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. MemorySSA позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ сокращСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции ΠΈ выполнСния ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто AliasSetTracker Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
  • Π’ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ LLDB Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° DWARF v5. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сборки с MinGW
    ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² Windows для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ARM ΠΈ ARM64. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ описания ΠΎΠΏΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ Π°Π²Ρ‚ΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Π²ΠΎΠ΄Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ табуляции.

  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° LLD. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ELF, Π² Ρ‚ΠΎΠΌ числС обСспСчСна полная ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ glob-шаблонов с ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ GNU, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сТатых ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… сСкций «.zdebug», Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ свойство PT_GNU_PROPERTY для опрСдСлСния сСкции .note.gnu.property (ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… ядрах Linux),
    Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ€Π΅ΠΆΠΈΠΌΡ‹ «-z noseparate-code», «-z separate-code» ΠΈ «-z separate-loadable-segments». Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° MinGW ΠΈ WebAssembly.

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

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