Izdanje paketa prevoditelja LLVM 10.0

Nakon šest mjeseci razvoja predstavio izdanje projekta LLVM 10.0 — GCC-kompatibilni alati (prevoditelji, optimizatori i generatori koda), kompajliranje programa u međubitni kod virtualnih instrukcija sličnih RISC-u (virtualni stroj niske razine sa sustavom optimizacije na više razina). Generirani pseudokod može se pretvoriti pomoću JIT kompajlera u strojne instrukcije izravno u trenutku izvođenja programa.

Nove značajke u LLVM 10.0 uključuju podršku za C++ koncepte, više ne pokreće Clang kao zaseban proces, podršku za CFG (control flow guard) provjere za Windows i podršku za nove CPU mogućnosti.

Poboljšanja u Clangu 10.0:

  • Dodana podrška za "koncepti", proširenje predloška C++ koje će biti uključeno u sljedeći standard kodnog naziva C++2a (uključen zastavom -std=c++2a).
    Koncepti vam omogućuju da definirate skup zahtjeva za parametre predloška koji, u vrijeme kompilacije, ograničavaju skup argumenata koji se mogu prihvatiti kao parametri predloška. Koncepti se mogu koristiti za izbjegavanje logičkih nedosljednosti između svojstava tipova podataka korištenih unutar predloška i svojstava tipa podataka ulaznih parametara.

    šablona
    koncept JednakostUporediva = zahtijeva (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Prema zadanim postavkama, zaustavlja se pokretanje zasebnog procesa ("clang -cc1") u kojem se izvodi kompilacija. Kompilacija se sada vrši u glavnom procesu, a opcija "-fno-integrated-cc1" može se koristiti za vraćanje starog ponašanja.
  • Novi dijagnostički načini:
    • "-Wc99-označivač" i "-Wreorder-init-list" upozoravaju protiv korištenja C99 inicijalizatora u C++ načinu rada u slučajevima kada su točni u C99, ali ne i u C++20.
    • "-Wsizeof-array-div" - hvata situacije kao što su "int arr[10]; …sizeof(arr) / sizeof(short)…” (trebalo bi biti “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - upozorava protiv upotrebe konstrukata kao što je upotreba operatora "^" (xor) u operacijama koje se mogu zamijeniti s potenciranjem (2^16).
    • "-Wfinal-dtor-non-final-class" - upozorava na klase koje nisu označene specifikatorom "final", ali imaju destruktor s atributom "final".
    • "-Wtautological-bitwise-compare" je grupa upozorenja za dijagnosticiranje tautoloških usporedbi između bitovne operacije i konstante i za prepoznavanje uvijek istinitih usporedbi u kojima se bitovna ILI operacija primjenjuje na nenegativan broj.
    • "-Wbitwise-conditional-parentheses" upozorava na probleme pri miješanju logičkih operatora AND (&) i OR (|) s uvjetnim operatorom (?:).
    • “-Wmisleading-indentation” analog je istoimenoj provjeri iz GCC-a, koja upozorava na uvučene izraze kao da su dio if/else/for/while bloka, ali zapravo nisu uključeni u ovaj blok .
    • Kada se navede "-Wextra", omogućena je provjera "-Wdeprecated-copy", upozoravajući na upotrebu konstruktora
      "move" i "copy" u klasama s eksplicitnom definicijom destruktora.

    • Provjere "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" su proširene.
    • Provjere "-Wbitwise-op-parentheses" i "-Wlogical-op-parentheses" onemogućene su prema zadanim postavkama.
  • U C i C++ kodu, aritmetičke operacije pokazivača dopuštene su samo u nizovima. Undefined Behavior Sanitizer u načinu rada "-fsanitize=pointer-overflow" sada hvata slučajeve kao što je dodavanje pomaka različitog od nule nultom pokazivaču ili stvaranje nultog pokazivača pri oduzimanju cijelog broja od nenultog pokazivača.
  • Način rada "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) prilagođen je za prepoznavanje problema s operacijama povećanja i smanjenja za tipove s veličinom bita manjom od one tipa "int".
  • Prilikom odabira x86 ciljnih arhitektura "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" i "-march=cooperlake" prema zadanim postavkama u vektoriziranom kod je prestao koristiti 512-bitne zmm registre, osim njihove izravne indikacije u izvornom kodu. Razlog je taj što se CPU frekvencija smanjuje pri izvođenju 512-bitnih operacija, što može negativno utjecati na ukupnu izvedbu. Za promjenu novog ponašanja dostupna je opcija "-mprefer-vector-width=512".
  • Ponašanje zastavice "-flax-vector-conversions" slično je GCC-u: zabranjene su implicitne vektorske pretvorbe bitova između cijelih brojeva i vektora s pomičnim zarezom. Kako bi se uklonilo ovo ograničenje, predlaže se korištenje zastavice
    "-flax-vector-conversions=all" što je zadano.

  • Poboljšana podrška za MIPS procesore obitelji Octeon. Dodan "octeon+" na popis važećih tipova procesora.
  • Prilikom sastavljanja u međukod WebAssembly automatski se poziva wasm-opt optimizator, ako je dostupan u sustavu.
  • Za sustave koji se temelje na arhitekturi RISC-V, upotreba registara koji pohranjuju vrijednosti s pomičnim zarezom dopuštena je u uvjetnim blokovima asemblerskih inline umetaka.
  • Dodane su nove oznake prevoditelja: "-fgnuc-version" za postavljanje vrijednosti verzije za "__GNUC__" i slične makronaredbe; "-fmacro-prefix-map=OLD=NEW" za zamjenu prefiksa direktorija OLD s NEW u makroima kao što je "__FILE__"; "-fpatchable-function-entry=N[,M]" za generiranje određenog broja NOP instrukcija prije i poslije ulazne točke funkcije. Za RISC-V
    dodana podrška za oznake "-ffixed-xX", "-mcmodel=medany" i "-mcmodel=medlow".

  • Dodana je podrška za atribut '__attribute__((target("branch-protection=..."))), čiji je učinak sličan opciji -zaštita grana.
  • Na Windows platformi, kada se navodi zastavica “-cfguard”, implementirana je zamjena provjera integriteta tijeka izvršavanja (Control Flow Guard) za neizravne pozive funkcija. Da biste onemogućili zamjenu provjere, možete upotrijebiti oznaku "-cfguard-nochecks" ili modifikator "__declspec(guard(nocf))".
  • Ponašanje atributa gnu_inline slično je GCC-u u slučajevima kada se koristi bez ključne riječi "extern".
  • Proširene su mogućnosti povezane s OpenCL i CUDA podrškom. Dodana podrška za nove značajke OpenMP 5.0.
  • Opcija Standard dodana je uslužnom programu clang-format, koja vam omogućuje da odredite verziju C++ standarda koja se koristi prilikom parsiranja i oblikovanja koda (Najnovije, Auto, c++03, c++11, c++14, c++17, c++20 ).
  • Nove provjere dodane su statičkom analizatoru: alpha.cplusplus.PlacementNew za utvrđivanje ima li dovoljno prostora za pohranu, fuchsia.HandleChecker za otkrivanje curenja povezanih s Fuchsia rukovateljima, security.insecureAPI.decodeValueOfObjCType za otkrivanje potencijalnih prekoračenja međuspremnika pri korištenju [NSCoder decodeValueOfObjCType :at:] .
  • Undefined Behavior Sanitizer (UBSan) proširio je svoje provjere preljeva pokazivača kako bi uhvatio primjenu pomaka koji nisu nula na pokazivače NULL ili rezultirajuće dodavanje pomaka pokazivača NULL.
  • U linteru zveket-uredan dodao velik dio novih čekova.

Glavni inovacije LLVM 10.0:

  • Do okvira Pripisivač Dodane su nove interproceduralne optimizacije i analizatori. Predviđeno je stanje 19 različitih atributa, uključujući 12 atributa 12 LLVM IR i 7 apstraktnih atributa kao što je živost.
  • Dodane su nove matrične matematičke funkcije ugrađene u kompajler (Intrinzike), koje su zamijenjene učinkovitim vektorskim uputama tijekom kompilacije.
  • Brojna poboljšanja napravljena su na pozadinama za X86, AArch64, ARM, SystemZ, MIPS, AMDGPU i PowerPC arhitekture. Dodana CPU podrška
    Cortex-A65, Cortex-A65AE, Neoverse E1 i Neoverse N1. Za ARMv8.1-M, ​​proces generiranja koda je optimiziran (na primjer, pojavila se podrška za petlje s minimalnim opterećenjem) i dodana je podrška za autovektorizaciju pomoću MVE ekstenzije. Poboljšana CPU MIPS Octeon podrška. Za PowerPC je omogućena vektorizacija matematičkih potprograma pomoću biblioteke MASSV (Mathematical Acceleration SubSystem), generiranje koda je poboljšano, a pristup memoriji iz petlji je optimiziran. Za x86, rukovanje tipovima vektora v2i32, v4i16, v2i16, v8i8, v4i8 i v2i8 je promijenjeno.

  • Poboljšani generator koda za WebAssembly. Dodana podrška za TLS (Thread-Local Storage) i atomic.fence upute. Podrška za SIMD značajno je proširena. Objektne datoteke WebAssembly sada imaju mogućnost korištenja potpisa funkcija s više vrijednosti.
  • Analizator se koristi pri obradi petlji MemorySSA, koji vam omogućuje definiranje ovisnosti između različitih memorijskih operacija. MemorySSA može smanjiti vrijeme kompilacije i izvođenja ili se može koristiti umjesto AliasSetTracker bez gubitka performansi.
  • LLDB debugger je značajno poboljšao podršku za DWARF v5 format. Poboljšana podrška za izgradnju s MinGW-om
    i dodana početna mogućnost otklanjanja pogrešaka u Windows izvršnim datotekama za ARM i ARM64 arhitekture. Dodani opisi ponuđenih opcija prilikom automatskog dovršavanja unosa pritiskom na tab.

  • Prošireno Mogućnosti LLD povezivača. Poboljšana podrška za ELF format, uključujući punu kompatibilnost glob predložaka s GNU povezivačem, dodana podrška za komprimirane odjeljke za ispravljanje pogrešaka ".zdebug", dodano svojstvo PT_GNU_PROPERTY za definiranje odjeljka .note.gnu.property (može se koristiti u budućem Linuxu jezgre),
    Implementirani su načini rada “-z noseparate-code”, “-z separate-code” i “-z separate-loadable-segments”. Poboljšana podrška za MinGW i WebAssembly.

Izvor: opennet.ru

Dodajte komentar