Ħruġ tas-suite tal-kompilaturi LLVM 10.0

Wara sitt xhur ta 'żvilupp ippreżentata rilaxx tal-proġett LLVM 10.0 — Għodod kompatibbli mal-GCC (kompilaturi, ottimizzaturi u ġeneraturi ta' kodiċi), li jikkompilaw programmi f'bitcode intermedju ta' struzzjonijiet virtwali bħal RISC (magna virtwali ta' livell baxx b'sistema ta' ottimizzazzjoni f'diversi livelli). Il-psewdocode iġġenerat jista 'jiġi kkonvertit bl-użu ta' kompilatur JIT fi struzzjonijiet tal-magni direttament fil-ħin tal-eżekuzzjoni tal-programm.

Karatteristiċi ġodda f'LLVM 10.0 jinkludu appoġġ għal Kunċetti C++, ma jibqax jaħdem Clang bħala proċess separat, appoġġ għal kontrolli CFG (kontroll tal-fluss) għall-Windows, u appoġġ għal kapaċitajiet ġodda ta 'CPU.

Titjib f'Clang 10.0:

  • Appoġġ miżjud għal "kunċetti", estensjoni tal-mudell C++ li se tkun inkluża fl-istandard li jmiss, bl-isem ta' kodiċi C++2a (mixgħul mill-bandiera -std=c++2a).
    Kunċetti jippermettulek tiddefinixxi sett ta' rekwiżiti ta' parametri tal-mudell li, fil-ħin tal-kumpilazzjoni, jillimitaw is-sett ta' argumenti li jistgħu jiġu aċċettati bħala parametri tal-mudell. Il-kunċetti jistgħu jintużaw biex jiġu evitati inkonsistenzi loġiċi bejn il-proprjetajiet tat-tipi tad-dejta użati fil-mudell u l-proprjetajiet tat-tip tad-dejta tal-parametri tad-dħul.

    mudell
    kunċett UgwaljanzaKomparabbli = teħtieġ(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • B'mod awtomatiku, it-tnedija ta' proċess separat (“clang -cc1”) li fih titwettaq il-kumpilazzjoni titwaqqaf. Il-kumpilazzjoni issa ssir fil-proċess ewlieni, u l-għażla "-fno-integrated-cc1" tista 'tintuża biex tirrestawra l-imġieba l-antika.
  • Modi dijanjostiċi ġodda:
    • "-Wc99-designator" u "-Wreorder-init-list" iwissu kontra l-użu ta' initializers C99 fil-mod C++ f'każijiet fejn huma korretti f'C99 iżda mhux f'C++20.
    • "-Wsizeof-array-div" - jaqbad sitwazzjonijiet bħal "int arr[10]; …sizeof(arr) / sizeof(short)...” (għandu jkun “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - iwissi kontra l-użu ta 'kostruzzjonijiet bħall-użu ta' l-operatur "^" (xor) f'operazzjonijiet li jistgħu jiġu konfużi ma 'esponenzjazzjoni (2^16).
    • "-Wfinal-dtor-non-final-class" - iwissi dwar klassijiet li mhumiex immarkati bl-ispeċifikazzjoni "finali", iżda għandhom destructor bl-attribut "finali".
    • "-Wtautological-bitwise-compare" huwa grupp ta 'twissijiet għad-dijanjosi ta' paraguni tawtoloġiċi bejn operazzjoni bit-bit u kostanti, u għall-identifikazzjoni ta 'paraguni dejjem veri li fihom l-operazzjoni OR bit-bit tiġi applikata għal numru mhux negattiv.
    • "-Wbitwise-conditional-parentheses" twissi dwar problemi meta tħallat l-operaturi loġiċi AND (&) u JEW (|) mal-operatur kondizzjonali (?:).
    • “-Wmisleading-indentation” hija analoga tal-kontroll tal-istess isem minn GCC, li jwissi dwar espressjonijiet indentati bħallikieku huma parti minn blokk if/else/for/while, iżda fil-fatt mhumiex inklużi f’dan il-blokk .
    • Meta tispeċifika “-Wextra”, il-verifika “-Wdeprecated-copy” hija attivata, twissija dwar l-użu tal-kostrutturi
      "ċaqlaq" u "kopja" fi klassijiet b'definizzjoni espliċita ta' distruttur.

    • Il-kontrolli "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" ġew estiżi.
    • Il-kontrolli "-Wbitwise-op-parentheses" u "-Wlogical-op-parentheses" huma diżattivati ​​b'mod awtomatiku.
  • Fil-kodiċi C u C++, operazzjonijiet aritmetiċi tal-pointer huma permessi biss f'arrays. Il-Undefined Behavior Sanitizer fil-mod "-fsanitize=pointer-overflow" issa jaqbad każijiet bħaż-żieda ta' offset mhux żero għal pointer null jew il-ħolqien ta 'pointer null meta jitnaqqas numru sħiħ minn pointer mhux null.
  • Il-mod "-fsanitize=implicit-conversion" (Sanitizer ta 'Konverżjoni Impliċita) huwa adattat biex jidentifika problemi b'operazzjonijiet ta' inkrement u tnaqqis għal tipi b'daqs daqsxejn iżgħar minn dak tat-tip "int".
  • Meta tagħżel arkitetturi fil-mira x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" u "-march=cooperlake" b'mod awtomatiku b'vettorizzat Il- kodiċi waqaf juża reġistri zmm 512-bit, ħlief għall-indikazzjoni diretta tagħhom fil-kodiċi tas-sors. Ir-raġuni hija li l-frekwenza tas-CPU tonqos meta twettaq operazzjonijiet ta '512-bit, li jistgħu jaffettwaw b'mod negattiv il-prestazzjoni ġenerali. Biex tinbidel l-imġiba l-ġdida, hija pprovduta l-għażla "-mprefer-vector-width=512".
  • L-imġiba tal-bandiera "-flax-vector-conversions" hija simili għal GCC: il-konverżjonijiet impliċiti tal-bit tal-vettur bejn integer u floating-point vectors huma pprojbiti. Biex tiġi eliminata din il-limitazzjoni, huwa propost li tintuża l-bandiera
    "-flax-vector-conversions=all" li hija l-inadempjenza.

  • Appoġġ imtejjeb għal CPUs MIPS tal-familja Octeon. Miżjud "octeon +" mal-lista ta 'tipi ta' CPU validi.
  • Meta l-assemblaġġ fil-kodiċi intermedju WebAssembly, l-ottimizzatur wasm-opt jissejjaħ awtomatikament, jekk disponibbli fis-sistema.
  • Għal sistemi bbażati fuq l-arkitettura RISC-V, l-użu ta 'reġistri li jaħżnu valuri floating point huwa permess fi blokki kondizzjonali ta' inserzjonijiet inline tal-assemblatur.
  • Miżjud bnadar ġodda tal-kompilatur: "-fgnuc-version" biex jiġi stabbilit il-valur tal-verżjoni għal "__GNUC__" u macros simili; "-fmacro-prefix-map=OLD=NEW" biex tissostitwixxi l-prefiss tad-direttorju OLD ma ĠODDA f'macros bħal "__FILE__"; "-fpatchable-function-entry=N[,M]" biex tiġġenera ċertu numru ta 'struzzjonijiet NOP qabel u wara l-punt tad-dħul tal-funzjoni. Għal RISC-V
    appoġġ miżjud għall-bnadar "-ffixed-xX", "-mcmodel=medany" u "-mcmodel=medlow".

  • Appoġġ miżjud għall-attribut '__attribute__((target ("branch-protection=..."))) attribut, li l-effett tiegħu huwa simili għall-għażla -branch-protezzjoni.
  • Fuq il-pjattaforma tal-Windows, meta tispeċifika l-bandiera "-cfguard", is-sostituzzjoni tal-kontrolli tal-integrità tal-fluss tal-eżekuzzjoni (Control Flow Guard) għal sejħiet ta 'funzjoni indiretta hija implimentata. Biex tiddiżattiva s-sostituzzjoni tal-kontroll, tista’ tuża l-bandiera “-cfguard-nochecks” jew il-modifikatur “__declspec(guard(nocf))”.
  • L-imġiba tal-attribut gnu_inline hija simili għal GCC f'każijiet fejn tintuża mingħajr il-kelma prinċipali "extern".
  • Il-kapaċitajiet assoċjati mal-appoġġ OpenCL u CUDA ġew estiżi. Appoġġ miżjud għal karatteristiċi ġodda ta' OpenMP 5.0.
  • Għażla Standard ġiet miżjuda mal-utilità tal-format clang, li tippermettilek tiddetermina l-verżjoni tal-istandard C++ użata meta tipparsja u tifformattja l-kodiċi (Latest, Auto, c++03, c++11, c++14, c++17, c++20).
  • Verifiki ġodda ġew miżjuda mal-analizzatur statiku: alpha.cplusplus.PlacementNew biex jiġi ddeterminat jekk hemmx biżżejjed spazju għall-ħażna, fuchsia.HandleChecker biex jiskopri tnixxijiet relatati ma’ Fuchsia handlers, security.insecureAPI.decodeValueOfObjCType biex jindividwaw buffer overflows potenzjali meta tuża [NSCoder decodebValueypeOf :fi:] .
  • L-Undefined Behavior Sanitizer (UBSan) espandiet il-kontrolli tal-overflow tal-pointer tiegħu biex jaqbad l-applikazzjoni ta 'offsets mhux żero għal pointers NULL jew iż-żieda li tirriżulta ta' offset tal-pointer NULL.
  • Fil linter clang-tidy miżjud porzjon kbir ta' kontrolli ġodda.

Il-prinċipali innovazzjonijiet LLVM 10.0:

  • Għall-qafas Attributur Ġew miżjuda ottimizzazzjonijiet u analizzaturi interproċedurali ġodda. L-istat ta '19-il attribut differenti huwa previst, inklużi 12-il attribut 12 LLVM IR u 7 attributi astratti bħall-ħajja.
  • Żiedu funzjonijiet matematiċi matriċi ġodda mibnija fil-kompilatur (Intrinsiċi), li huma sostitwiti minn struzzjonijiet vector effiċjenti waqt il-kumpilazzjoni.
  • Sar bosta titjib fil-backends għall-arkitetturi X86, AArch64, ARM, SystemZ, MIPS, AMDGPU u PowerPC. Miżjud appoġġ CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 u Neoverse N1. Għal ARMv8.1-M, ​​​​il-proċess tal-ġenerazzjoni tal-kodiċi ġie ottimizzat (pereżempju, deher appoġġ għal loops b'overhead minimu) u appoġġ għall-awtovectorization ġie miżjud bl-użu tal-estensjoni MVE. Appoġġ imtejjeb tas-CPU MIPS Octeon. Għal PowerPC, il-vettorizzazzjoni tas-subroutines matematiċi bl-użu tal-librerija MASSV (Mathematical Acceleration SubSystem) hija attivata, il-ġenerazzjoni tal-kodiċi hija mtejba, u l-aċċess għall-memorja minn loops huwa ottimizzat. Għal x86, l-immaniġġjar tat-tipi ta 'vettur v2i32, v4i16, v2i16, v8i8, v4i8 u v2i8 inbidel.

  • Ġeneratur tal-kodiċi mtejjeb għal WebAssembly. Appoġġ miżjud għal TLS (Thread-Local Storage) u istruzzjonijiet atomic.fence. L-appoġġ SIMD ġie estiż b'mod sinifikanti. Fajls ta' oġġetti WebAssembly issa għandhom il-kapaċità li jużaw firem ta' funzjonijiet b'ħafna valur.
  • L-analizzatur jintuża meta tipproċessa loops MemorySSA, li jippermettilek tiddefinixxi dipendenzi bejn operazzjonijiet ta 'memorja differenti. MemorySSA jista 'jnaqqas il-ħin ta' kumpilazzjoni u eżekuzzjoni jew jista 'jintuża minflok AliasSetTracker mingħajr telf ta' prestazzjoni.
  • Id-debugger LLDB tejjeb b'mod sinifikanti l-appoġġ għall-format DWARF v5. Appoġġ imtejjeb għall-bini bil-MinGW
    u żiedet il-kapaċità inizjali biex tiddibaggja l-eżekutibbli tal-Windows għall-arkitetturi ARM u ARM64. Miżjud deskrizzjonijiet tal-għażliet offruti meta l-input jimtleta awtomatikament billi tagħfas tab.

  • Estiża Kapaċità tal-linker LLD. Appoġġ imtejjeb għall-format ELF, inkluż l-iżgurar ta' kompatibilità sħiħa tal-mudelli glob mal-linker GNU, iż-żieda ta' appoġġ għal sezzjonijiet ta' debug kompressati ".zdebug", iż-żieda tal-proprjetà PT_GNU_PROPERTY biex tiddefinixxi t-taqsima .note.gnu.property (tista' tintuża fil-futur Linux kernels),
    Il-modi "-z noseparate-code", "-z separat-code" u "-z separati-loadable-segments" ġew implimentati. Appoġġ imtejjeb għal MinGW u WebAssembly.

Sors: opennet.ru

Żid kumment