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

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

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² Clang 16.0:

  • ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ стандарт C++/ObjC++ выставлСн Π² gnu++17 (Ρ€Π°Π½Π΅Π΅ примСнялся gnu++14), Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ возмоТностСй C++17 с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ GNU. Для возвращСния ΠΏΡ€Π΅ΠΆΠ½Π΅Π³ΠΎ повСдСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ «-std=gnu++14».
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ возмоТности, связанныС со стандартом C++20:
    • Условно-Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹,
    • Π·Π°Ρ…Π²Π°Ρ‚ структурированных привязок Π² лямбда-функциях,
    • ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ равСнства Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ,
    • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово typename Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… контСкстах,
    • Π”ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² скобках («Aggr(val1, val2)»).
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ возмоТности, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ стандартС C++2b:
    • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠΊ Π² ΠΊΠΎΠ½Ρ†Π΅ составных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ,
    • static operator(),
    • static operator[],
    • ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Ρ‚ΠΈΠΏΠΎΠΌ char8_t,
    • Π Π°ΡΡˆΠΈΡ€Π΅Π½ спСктр символов, допустимых для использования Π² «\N{…}»,
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ «static constexpr», Π² функциях, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ constexpr.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ возмоТности, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π‘ΠΈ-стандартС C2x:
    • Для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ прСдупрСТдСния «-Wunused-label» Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° «[[maybe_unused]]» ΠΊ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌ,
    • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠΊ Π² Π»ΡŽΠ±Ρ‹Ρ… мСстах Π²Π½ΡƒΡ‚Ρ€ΠΈ составных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ,
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ typeof ΠΈ typeof_unqual,
    • Новый Ρ‚ΠΈΠΏ nullptr_t ΠΈ константа nullptr для опрСдСлСния Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² любой Ρ‚ΠΈΠΏ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ NULL, Π½Π΅ привязанный ΠΊ цСлочислСнным Ρ‚ΠΈΠΏΠ°ΠΌ ΠΈ Ρ‚ΠΈΠΏΡƒ void*.
    • Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ C2x Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ Π²Ρ‹Π·ΠΎΠ² макроса va_start с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (variadic).
  • Π’ Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… соотвСтствия стандартам C99, C11 ΠΈ C17 ΠΎΠΏΡ†ΠΈΠΈ «-Wimplicit-function-declaration» ΠΈ «-Wimplicit-int» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ приводят ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ошибки вмСсто прСдупрСТдСния.
  • КосвСнноС использованиС «void *» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «void func(void *p) { *p; }») Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ C++ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ошибки, ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ISO C++, GCC, ICC ΠΈ MSVC.
  • Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π² качСствС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² инструкций (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «__asm { mov eax, s.bf }») Π² ассСмблСрных inline-Π±Π»ΠΎΠΊΠ°Ρ… Π² стилС Microsoft Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ошибки.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° диагностика наличия ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ структур ΠΈ объСдинСний с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π² Ρ€Π°Π·Π½Ρ‹Ρ… модулях.
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности, связанныС с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ OpenCL ΠΈ OpenMP. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° диагностика шаблонов C++, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ядра OpenCL. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±Π»ΠΎΠΊΠ° подстановки Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для AMDGPU. Ко всСм функциям нСявно Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ nounwind. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния CLANG_CRASH_DIAGNOSTICS_DIR для опрСдСлСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ диагностичСскиС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹Ρ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡΡ….
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Unicode ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° Π΄ΠΎ спСцификации Unicode 15.0. Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… матСматичСских символов Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ «₊» (, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ «double xₖ₊₁»).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (Π²Π½Π°Ρ‡Π°Π»Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π»Π°Π³ «—config=», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ нСсколько Ρ€Π°Π·). Π˜Π·ΠΌΠ΅Π½Ρ‘Π½ порядок Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: clang Π²Π½Π°Ρ‡Π°Π»Π΅ пытаСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» <triple>-<driver>.cfg, Π° Ссли ΠΎΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ пытаСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° <driver>.cfg ΠΈ <triple>.cfg. Для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «—no-default-config».
  • Для обСспСчСния повторяСмых сборок прСдоставлСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² макросах __DATE__, __TIME__ ΠΈ __TIMESTAMP__ Π½Π° врСмя, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния SOURCE_DATE_EPOCH.
  • Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (builtin), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² контСкстС констант, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ макрос «__has_constexpr_builtin».
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π»Π°Π³ компиляции «-fcoro-aligned-allocation» для Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΠΎΠ³ΠΎ распрСдСлСния ΠΊΠ°Π΄Ρ€ΠΎΠ² сопрограмм.
  • Π’ Ρ„Π»Π°Π³Π΅ «-fstrict-flex-arrays=» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ уровня ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ элСмСнта-массива Π² структурах (Flexible Array Members, массив Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² ΠΊΠΎΠ½Ρ†Π΅ структуры). На Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ «[]» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «int b[]») обрабатываСтся ΠΊΠ°ΠΊ Π³ΠΈΠ±ΠΊΠΈΠΉ массив, Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ «[0]» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «int b[0]») — Π½Π΅Ρ‚.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «-fmodule-output» для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΡ„Π°Π·Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ компиляции стандартных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ C++.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ «-Rpass-analysis=stack-frame-layout», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с раскладной стСковых ΠΊΠ°Π΄Ρ€ΠΎΠ².
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __attribute__((target_version(«cpu_features»))) ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° __attribute__((target_clones(«cpu_features1″,»cpu_features2»,…))) для Π²Ρ‹Π±ΠΎΡ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… вСрсий Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, прСдоставляСмых CPU AArch64.
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ срСдства диагностики:
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ «-Wsingle-bit-bitfield-constant-conversion» для опрСдСлСния нСявного усСчСния ΠΏΡ€ΠΈ присвоСнии Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ одноразрядному Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΌΡƒ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌΡƒ полю.
    • Π Π°ΡΡˆΠΈΡ€Π΅Π½Π° диагностика Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… constexpr-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ прСдупрСТдСния «-Wcast-function-type-strict» ΠΈ «-Wincompatible-function-pointer-types-strict» для выявлСния ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° диагностика использования Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΡ‘Π½ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² Π±Π»ΠΎΠΊΠ°Ρ… экспорта.
    • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΎ выявлСниС ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов «auto» Π² опрСдСлСниях.
    • Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прСдупрСТдСния «-Winteger-overflow» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций, приводящих ΠΊ пСрСполнСниям.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π½Π°Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ LoongArch (-march=loongarch64 ΠΈΠ»ΠΈ -march=la464), примСняСмой Π² процСссорах Loongson 3 5000 ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ RISC ISA, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° MIPS ΠΈ RISC-V.

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

  • Π’ ΠΊΠΎΠ΄Π΅ LLVM Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ использованиС элСмСнтов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π² стандартС C++17.
  • ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½Ρ‹ трСбования ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ для сборки LLVM. Π‘Π±ΠΎΡ€ΠΎΡ‡Π½Ρ‹ΠΉ инструмСнтарий Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ стандарт C++17, Ρ‚.Π΅. для сборки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ GCC 7.1, Clang 5.0, Apple Clang 10.0 ΠΈΠ»ΠΈ Visual Studio 2019 16.7.
  • Π’ бэкСнд для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ AArch64 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CPU Cortex-A715, Cortex-X3 ΠΈ Neoverse V2, ассСмблСра для RME MEC (Memory Encryption Contexts), Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Armv8.3 (Complex Number) ΠΈ мултивСрсионирования (Function Multi Versioning).
  • Π’ бэкСндС для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ARM ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Armv2, Armv2A, Armv3 ΠΈ Armv3M, гСнСрация ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° для инструкций Ρ€Π°Π±ΠΎΡ‚Ρ‹ с комплСксными числами.
  • Π’ бэкСнд для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ X86 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ Π½Π°Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° инструкций RDMSRLIST, RMSRLIST ΠΈ WRMSRNS. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΎΠΏΡ†ΠΈΠΈ «-mcpu=raptorlake», «-mcpu=meteorlake», «-mcpu=emeraldrapids», «-mcpu=sierraforest», «-mcpu=graniterapids» ΠΈ «-mcpu=grandridge».
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ LoongArch.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ бэкСнды для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ MIPS, PowerPC ΠΈ RISC-V
  • Π’ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ LLDB Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ 64-разрядных исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ LoongArch. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… символов COFF. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΎ отсСиваниС Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² DLL Π² спискС Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Windows-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
  • Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Libc++ основная Ρ€Π°Π±ΠΎΡ‚Π° Π±Ρ‹Π»Π° сосрСдоточСна Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй стандартов C++20 ΠΈ C++23.
  • Π’ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ΅ LDD Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сокращСно врСмя связывания Π·Π° счёт распараллСливания ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сканирования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ адрСсов ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСкций. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сТатия сСкций с использованиСм Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ZSTD.

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

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