Нашри маҷмӯи компилятори LLVM 10.0

Пас аз шаш моҳи рушд пешниҳод карда мешавад нашри лоиҳа LLVM 10.0 — Асбобҳои ба GCC мувофиқ (компиляторҳо, оптимизаторҳо ва генераторҳои код), тартиб додани барномаҳо ба биткоди фосилавии дастурҳои виртуалии ба RISC монанд (мошини виртуалии сатҳи паст бо системаи оптимизатсияи бисёрсатҳа). Псевдокоди тавлидшуда метавонад бо истифода аз компилятори JIT ба дастурҳои мошин бевосита дар вақти иҷрои барнома табдил дода шавад.

Хусусиятҳои нав дар LLVM 10.0 дорои дастгирии консепсияҳои C++ мебошанд, дигар Clang-ро ҳамчун як раванди алоҳида иҷро намекунанд, дастгирии санҷишҳои CFG (муҳофизи ҷараёни назорат) барои Windows ва дастгирии қобилиятҳои нави CPU.

Беҳбудиҳо дар Clang 10.0:

  • Дастгирии иловашуда барои "мафҳумҳо", тамдиди қолаби C++, ки ба стандарти навбатӣ дохил карда мешавад, бо номи рамзи C++2a (бо парчами -std=c++2a фаъол карда мешавад).
    Мафҳумҳо ба шумо имкон медиҳанд, ки маҷмӯи талаботи параметрҳои шаблонро муайян кунед, ки дар вақти тартибдиҳӣ маҷмӯи аргументҳоеро, ки ҳамчун параметрҳои қолабӣ қабул карда мешаванд, маҳдуд мекунанд. Мафҳумҳоро барои пешгирӣ кардани номутобиқатии мантиқӣ байни хосиятҳои намудҳои додаҳои дар қолаб истифодашаванда ва хосиятҳои навъи додаҳои параметрҳои вуруд истифода бурдан мумкин аст.

    шаблон
    консепсияи баробарӣ муқоисашаванда = талаб мекунад (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" - огоҳ мекунад дар бораи синфҳое, ки бо мушаххаскунандаи "ниҳоӣ" қайд карда нашудаанд, аммо вайронкуни дорои атрибути "ниҳоӣ" мебошанд.
    • "-Wtautological-bitwise-compare" як гурӯҳи огоҳиҳо барои ташхиси муқоисаи тавтологӣ байни амалиёти битӣ ва доимӣ ва барои муайян кардани муқоисаҳои ҳамеша ҳақиқӣ мебошад, ки дар он амалиёти битӣ OR ба рақами ғайриманфӣ татбиқ мешавад.
    • "-Wbitwise-conditional-қавс" аз мушкилот ҳангоми омехта кардани операторҳои мантиқии ВА (&) ва Ё (|) бо оператори шартӣ (?:) огоҳ мекунад.
    • "-Wmisleading-indentation" аналоги чеки ҳамон ном аз GCC мебошад, ки дар бораи ибораҳои бандшуда ҳушдор медиҳад, ки гӯё онҳо қисми блоки if/else/for/while бошанд, аммо дар асл онҳо ба ин блок дохил карда нашудаанд. .
    • Ҳангоми муайян кардани "-Wextra", санҷиши "-Wdeprecated-copy" фаъол карда мешавад, ки дар бораи истифодаи конструкторҳо огоҳ мекунад
      "кӯчондан" ва "нусхабардорӣ" дар синфҳо бо таърифи возеҳ харобкунанда.

    • Санҷишҳои "-Wtautological-overlap-contare", "-Wsizeof-pointer-div", "-Wtautological-contae", "-Wrange-loop-analysis" васеъ карда шуданд.
    • Санҷишҳои "-Wbitwise-op-parentheses" ва "-Wlogical-op-parentheses" ба таври нобаёнӣ ғайрифаъол карда мешаванд.
  • Дар кодҳои C ва C++, амалҳои арифметикии нишондиҳанда танҳо дар массивҳо иҷозат дода мешаванд. Санитизатори номуайяншудаи рафтор дар реҷаи "-fsanitize=pointer-overflow" ҳоло ҳолатҳоеро, ба монанди илова кардани ҷуброни ғайрисифр ба нишондиҳандаи сифр ё эҷоди нишоннамои нул ҳангоми тарҳ кардани адади бутун аз нишондиҳандаи ғайринулл.
  • Ҳолати "-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. "octeon +" ба рӯйхати намудҳои эътибори CPU илова карда шуд.
  • Ҳангоми васлшавӣ ба рамзи фосилавии WebAssembly, агар дар система мавҷуд бошад, оптимизатори wasm-opt ба таври худкор даъват карда мешавад.
  • Барои системаҳое, ки ба меъмории RISC-V асос ёфтаанд, истифодаи регистрҳое, ки арзишҳои нуқтаи шинокунандаро нигоҳ медоранд, дар блокҳои шартии замимаҳои дохилии ассемблер иҷозат дода мешавад.
  • Парчамҳои нави компилятор илова карда шуданд: "-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=..."))) аттрибут, ки таъсири он ба опсия шабеҳ аст -ҳифзи филиал.
  • Дар платформаи Windows, ҳангоми муайян кардани парчами "-cfguard", иваз кардани якпорчагии тафтиши ҷараёни иҷро (Control Flow Guard) барои зангҳои ғайримустақими функсия амалӣ карда мешавад. Барои хомӯш кардани ивазкунии чек, шумо метавонед парчами "-cfguard-nochecks" ё тағирдиҳандаи "__declspec(guard(nocf))"-ро истифода баред.
  • Рафтори аттрибути gnu_inline ба GCC дар ҳолатҳое монанд аст, ки он бе калимаи калидии "extern" истифода мешавад.
  • Имкониятҳои марбут ба дастгирии OpenCL ва CUDA васеъ карда шуданд. Дастгирии иловашуда барои хусусиятҳои нави OpenMP 5.0.
  • Опсияи стандартӣ ба утилитаи clang-format илова карда шуд, ки ба шумо имкон медиҳад версияи стандарти C++-ро ҳангоми таҳлил ва форматкунии код муайян кунед (Lest, Auto, c++03, c++11, c++14, c++17, c++20).
  • Чекҳои нав ба таҳлилгари статикӣ илова карда шуданд: alpha.cplusplus.PlacementNew барои муайян кардани мавҷудияти фазои кофӣ барои нигоҳдорӣ, fuchsia.HandleChecker барои ошкор кардани ихроҷи марбут ба коркардкунандагони Fuchsia, security.insecureAPI.decodeValueOfObjCType барои ошкор кардани буфери эҳтимолии [overflowder NSCo deVdef] :дар:].
  • Санитизатори номуайяншудаи рафтор (UBSan) санҷишҳои изофии нишондиҳандаҳои худро васеъ кардааст, то татбиқи ҷубронҳои ғайрисифр ба нишондиҳандаҳои NULL ё иловаи дар натиҷа ҷуброни нишондиҳандаи NULL.
  • Дар линтер садои тоза илова кард як қисми зиёди чекҳои нав.

асосӣ навовариҳо LLVM 10.0:

  • Ба чаҳорчӯба Атрибутор Оптимизатсияҳо ва анализаторҳои нави байнипроцессуалӣ илова карда шуданд. Ҳолати 19 атрибутҳои гуногун пешбинӣ шудааст, аз ҷумла 12 атрибутҳо 12 LLVM IR ва 7 атрибутҳои абстрактӣ ба монанди зинда.
  • Функсияҳои нави математикии матритса, ки дар компилятор сохта шудаанд, илова карда шуданд (Мушкилот), ки ҳангоми тартиб додан бо дастурҳои самараноки векторӣ иваз карда мешаванд.
  • Барои меъмории 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 бе талафоти кор истифода шавад.
  • Debuger LLDB дастгирии формати DWARF v5-ро ба таври назаррас беҳтар кардааст. Дастгирии беҳтар барои сохтмон бо MinGW
    ва илова қобилияти ибтидоии ислоҳи файлҳои иҷрошавандаи Windows барои меъмории ARM ва ARM64. Тавсифи имконоти пешниҳодшуда ҳангоми пуркунии худкор тавассути пахш кардани ҷадвал илова карда шуд.

  • Васеъ карда шудааст Имкониятҳои пайвандгари LLD. Дастгирии мукаммал барои формати ELF, аз ҷумла таъмини мутобиқати пурраи қолибҳои glob бо пайвандгари GNU, илова кардани дастгирии бахшҳои дебагҳои фишурда ".zdebug", илова кардани амволи PT_GNU_PROPERTY барои муайян кардани бахши .note.gnu.property (метавонад дар оянда истифода шавад) ядроҳои Linux),
    Режимҳои "-z noseparate-code", "-z separat-code" ва "-z separat-segments-loadable-segments" амалӣ карда шуданд. Дастгирии беҳтар барои MinGW ва WebAssembly.

Манбаъ: opennet.ru

Илова Эзоҳ