Izdaja zbirke prevajalnikov LLVM 10.0

Po šestih mesecih razvoja predstavljeno izdaja projekta LLVM 10.0 - Orodja, združljiva z GCC (prevajalniki, optimizatorji in generatorji kode), ki prevajajo programe v vmesno bitno kodo virtualnih navodil, podobnih RISC (nizkonivojski virtualni stroj z večnivojskim optimizacijskim sistemom). Ustvarjeno psevdo kodo lahko prevajalnik JIT pretvori v strojna navodila takoj ob izvajanju programa.

Nove funkcije v LLVM 10.0 vključujejo podporo za koncepte C++, Clang se ne izvaja več kot ločen proces, podporo za preverjanja CFG (zaščita toka nadzora) za Windows in podporo za nove zmogljivosti CPU.

Izboljšave v Clang 10.0:

  • Dodana podpora za "konceptov", razširitev predloge C++, ki bo vključena v naslednji standard s kodnim imenom C++2a (vklopljen z zastavico -std=c++2a).
    Koncepti vam omogočajo, da definirate nabor zahtev za parametre predloge, ki v času prevajanja omejujejo nabor argumentov, ki jih je mogoče sprejeti kot parametre predloge. Koncepte je mogoče uporabiti za izogibanje logičnim neskladjem med lastnostmi podatkovnih tipov, uporabljenih v predlogi, in lastnostmi podatkovnega tipa vhodnih parametrov.

    predloga
    koncept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Privzeto je ustavljen zagon ločenega procesa (»clang -cc1«), v katerem se izvaja prevajanje. Prevajanje je zdaj opravljeno v glavnem procesu in možnost "-fno-integrated-cc1" lahko uporabite za obnovitev starega vedenja.
  • Novi diagnostični načini:
    • »-Wc99-designator« in »-Wreorder-init-list« svarita pred uporabo inicializatorjev C99 v načinu C++ v primerih, ko so pravilni v C99, ne pa tudi v C++20.
    • "-Wsizeof-array-div" - ujame situacije, kot je "int arr[10]; …sizeof(arr) / sizeof(short)…« (moralo bi biti »sizeof(arr) / sizeof(int)«).
    • "-Wxor-used-as-po" - svari pred uporabo konstruktov, kot je uporaba operatorja "^" (xor) v operacijah, ki jih je mogoče zamenjati s potenciranjem (2^16).
    • "-Wfinal-dtor-non-final-class" - opozarja na razrede, ki niso označeni z "final" specifikatorjem, imajo pa destruktor z atributom "final".
    • »-Wtautological-bitwise-compare« je skupina opozoril za diagnosticiranje tavtoloških primerjav med bitno operacijo in konstanto ter za identifikacijo vedno resničnih primerjav, v katerih se bitna operacija ALI uporablja za nenegativno število.
    • "-Wbitwise-conditional-parentheses" opozarja na težave pri mešanju logičnih operatorjev IN (&) in ALI (|) s pogojnim operatorjem (?:).
    • »-Wmisleading-indentation« je analog istoimenskega preverjanja iz GCC, ki opozori na zamaknjene izraze, kot da so del bloka if/else/for/while, vendar dejansko niso vključeni v ta blok .
    • Ko podate »-Wextra«, je omogočeno preverjanje »-Wdeprecated-copy«, ki opozarja na uporabo konstruktorjev
      "premakni" in "kopiraj" v razredih z eksplicitno definicijo destruktorja.

    • Preverjanja »-Wtautological-overlap-compare«, »-Wsizeof-pointer-div«, »-Wtautological-compare«, »-Wrange-loop-analysis« so bila razširjena.
    • Kontroli "-Wbitwise-op-parentheses" in "-Wlogical-op-parentheses" sta privzeto onemogočeni.
  • V kodi C in C++ so aritmetične operacije kazalca dovoljene samo v nizih. Undefined Behavior Sanitizer v načinu »-fsanitize=pointer-overflow« zdaj lovi primere, kot je dodajanje odmika, ki ni nič, ničelnemu kazalcu ali ustvarjanje ničelnega kazalca pri odštevanju celega števila od kazalca, ki ni nič.
  • Način "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) je prilagojen za prepoznavanje težav z operacijami povečevanja in zmanjševanja za tipe z velikostjo bitov, ki je manjša od velikosti tipa "int".
  • Pri izbiri ciljnih arhitektur x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" in "-march=cooperlake" privzeto v vektoriziranem koda je prenehala uporabljati 512-bitne registre zmm, razen njihove neposredne navedbe v izvorni kodi. Razlog je v tem, da se frekvenca procesorja pri izvajanju 512-bitnih operacij zmanjša, kar lahko negativno vpliva na splošno zmogljivost. Če želite spremeniti novo vedenje, je na voljo možnost "-mprefer-vector-width=512".
  • Obnašanje zastavice "-flax-vector-conversions" je podobno GCC: implicitne vektorske bitne pretvorbe med vektorji celih števil in vektorji s plavajočo vejico so prepovedane. Za odpravo te omejitve je predlagana uporaba zastavice
    "-flax-vector-conversions=all", kar je privzeto.

  • Izboljšana podpora za procesorje MIPS iz družine Octeon. Dodan "octeon+" na seznam veljavnih tipov procesorjev.
  • Pri sestavljanju v vmesno kodo WebAssembly se samodejno pokliče optimizator wasm-opt, če je na voljo v sistemu.
  • Za sisteme, ki temeljijo na arhitekturi RISC-V, je dovoljena uporaba registrov, ki shranjujejo vrednosti s plavajočo vejico, v pogojnih blokih inline vstavkov asemblerja.
  • Dodane nove zastavice prevajalnika: "-fgnuc-version" za nastavitev vrednosti različice za "__GNUC__" in podobne makre; "-fmacro-prefix-map=OLD=NEW" za zamenjavo predpone imenika OLD z NEW v makrih, kot je "__FILE__"; "-fpatchable-function-entry=N[,M]" za ustvarjanje določenega števila navodil NOP pred in za vstopno točko funkcije. Za RISC-V
    dodana podpora za zastavice "-ffixed-xX", "-mcmodel=medany" in "-mcmodel=medlow".

  • Dodana podpora za atribut ‘__attribute__((target(“branch-protection=...”))), katerega učinek je podoben možnosti -zaščita vej.
  • Na platformi Windows je pri podajanju zastavice »-cfguard« izvedena zamenjava preverjanja celovitosti toka izvajanja (Control Flow Guard) za posredne klice funkcij. Če želite onemogočiti zamenjavo preverjanja, lahko uporabite zastavico »-cfguard-nochecks« ali modifikator »__declspec(guard(nocf))«.
  • Vedenje atributa gnu_inline je podobno GCC v primerih, ko se uporablja brez ključne besede "extern".
  • Zmogljivosti, povezane s podporo za OpenCL in CUDA, so bile razširjene. Dodana podpora za nove funkcije OpenMP 5.0.
  • Pripomočku clang-format je bila dodana možnost Standard, ki vam omogoča, da določite različico standarda C++, ki se uporablja pri razčlenjevanju in oblikovanju kode (najnovejše, samodejno, c++03, c++11, c++14, c++17, c++20 ).
  • V statični analizator so bila dodana nova preverjanja: alpha.cplusplus.PlacementNew za ugotavljanje, ali je dovolj prostora za shranjevanje, fuchsia.HandleChecker za odkrivanje puščanj, povezanih z obdelovalci Fuchsia, security.insecureAPI.decodeValueOfObjCType za odkrivanje morebitnih prekoračitev medpomnilnika pri uporabi [NSCoder decodeValueOfObjCType :at:] .
  • Orodje za razkuževanje nedefiniranega vedenja (UBSan) je razširilo svoja preverjanja prelivanja kazalca, da ujame uporabo neničelnih odmikov pri kazalcih NULL ali posledično dodajanje odmika kazalca NULL.
  • V linterju žvenketajoče dodano velik del novih čekov.

Glavni inovacije LLVM 10.0:

  • Na okvir Pripisovalec Dodane so bile nove medproceduralne optimizacije in analizatorji. Predvideno je stanje 19 različnih atributov, vključno z 12 atributi 12 LLVM IR in 7 abstraktnimi atributi, kot je živahnost.
  • Dodane nove matrične matematične funkcije, vgrajene v prevajalnik (intrinzične lastnosti), ki jih med prevajanjem nadomestijo učinkovita vektorska navodila.
  • Zaledja za arhitekture X86, AArch64, ARM, SystemZ, MIPS, AMDGPU in PowerPC so bile narejene številne izboljšave. Dodana podpora za procesor
    Cortex-A65, Cortex-A65AE, Neoverse E1 in Neoverse N1. Za ARMv8.1-M je bil proces generiranja kode optimiziran (na primer, pojavila se je podpora za zanke z minimalnimi stroški) in dodana podpora za samodejno vektorizacijo z uporabo razširitve MVE. Izboljšana podpora CPU MIPS Octeon. Za PowerPC je omogočena vektorizacija matematičnih podprogramov z uporabo knjižnice MASSV (Mathematical Acceleration SubSystem), generiranje kode je izboljšano in dostop do pomnilnika iz zank je optimiziran. Za x86 je spremenjeno obravnavanje vektorskih vrst v2i32, v4i16, v2i16, v8i8, v4i8 in v2i8.

  • Izboljšan generator kode za WebAssembly. Dodana podpora za navodila TLS (Thread-Local Storage) in atomic.fence. Podpora SIMD je bila znatno razširjena. Objektne datoteke WebAssembly imajo zdaj možnost uporabe podpisov funkcij z več vrednostmi.
  • Analizator se uporablja pri obdelavi zank MemorySSA, ki vam omogoča definiranje odvisnosti med različnimi pomnilniškimi operacijami. MemorySSA lahko skrajša čas prevajanja in izvajanja ali pa ga lahko uporabite namesto AliasSetTracker brez izgube zmogljivosti.
  • Razhroščevalnik LLDB je znatno izboljšal podporo za format DWARF v5. Izboljšana podpora za gradnjo z MinGW
    in dodana začetna zmožnost odpravljanja napak v izvršljivih datotekah Windows za arhitekturi ARM in ARM64. Dodani opisi možnosti, ponujenih pri samodokončanju vnosa s pritiskom na tabulatorko.

  • Razširjeno Zmogljivosti povezovalnika LLD. Izboljšana podpora za format ELF, vključno s popolno združljivostjo predlog glob s povezovalcem GNU, dodana podpora za stisnjene razdelke za odpravljanje napak ".zdebug", dodana lastnost PT_GNU_PROPERTY za definiranje razdelka .note.gnu.property (lahko se uporablja v prihodnjem Linuxu jedrca),
    Implementirani so bili načini »-z ločena-koda«, »-z ločena-koda« in »-z ločeni-nalagalni-segmenti«. Izboljšana podpora za MinGW in WebAssembly.

Vir: opennet.ru

Dodaj komentar