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.
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.
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.