Nakon šest mjeseci razvoja predstavljen izdanje projekta LLVM 11.0 — GCC-kompatibilni alati (kompajlatori, optimizatori i generatori koda), kompajliranje programa u srednji bit kod virtuelnih instrukcija sličnih RISC-u (virtuelna mašina niskog nivoa sa sistemom optimizacije na više nivoa). Generisani pseudokod se može konvertovati pomoću JIT kompajlera u mašinske instrukcije direktno u vreme izvršavanja programa.
Ključna promjena u novom izdanju je uključivanje Bok, frontend za jezik Fortran. Flang podržava Fortran 2018, OpenMP 4.5 i OpenACC 3.0, ali razvoj projekta još nije završen i front end je ograničen na raščlanjivanje koda i provjeru ispravnosti. Generisanje LLVM međukoda još uvek nije podržano i za generisanje izvršnih datoteka, kanonski kod se generiše i prosleđuje eksternom Fortran kompajleru.
Dodata mogućnost vraćanja stabla apstraktne sintakse (AST) za neispravan C++ kod, koji se može koristiti za dijagnosticiranje grešaka i pruža dodatne informacije vanjskim uslužnim programima kao što su clang-tidy i clangd. Funkcija je podrazumevano omogućena za C++ kod i kontroliše se preko opcija "-Xclang -f[no-]recovery-ast".
Dodani novi dijagnostički načini:
“-Wpointer-to-int-cast” je grupa upozorenja o pretvaranju pokazivača na int tipa cjelobrojnog tipa koji ne prihvaća sve moguće vrijednosti.
“-Wuninitialized-const-reference” - upozorenje o prosljeđivanju neinicijaliziranih varijabli u parametrima funkcije koji prihvataju referentne argumente s atributom “const”.
"-Wimplicit-const-int-float-conversion" - omogućeno po defaultu upozorenje o implicitnoj konverziji realne konstante u cjelobrojni tip.
Za ARM platformu, obezbeđene su C funkcije ugrađene u kompajler (Intrinsics), zamijenjen efikasnim vektorskim instrukcijama Arm v8.1-M MVE i CDE. Dostupne funkcije definirane su u datotekama zaglavlja arm_mve.h i arm_cde.h.
Dodano skup proširenih cjelobrojnih tipova _ExtInt(N), koji vam omogućava da kreirate tipove koji nisu višestruki stepena dva, a koji se mogu efikasno obraditi na FPGA/HLS. Na primjer, _ExtInt(7) definira cjelobrojni tip koji se sastoji od 7 bitova.
Dodani makroi koji definiraju podršku za ugrađene C funkcije na osnovu ARM SVE (Scalable Vector Extension) instrukcija:
__ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
__ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
__ARM_FEATURE_SVE_MATMUL_INT8,
__ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
__ARM_FEATURE_SVE2_BITPERM,
__ARM_FEATURE_SVE2_SHA3,
__ARM_FEATURE_SVE2_SM4. Na primjer, __ARM_FEATURE_SVE makro je definiran prilikom generiranja AArch64 koda postavljanjem opcije komandne linije "-march=armv8-a+sve".
Oznaka "-O" je sada identificirana sa "-O1" optimizacijskim modom umjesto "-O2".
"-ffp-exception-behavior={ignore,maytrap,strict}" - omogućava vam da odaberete način rukovanja izuzetkom za brojeve s pomičnim zarezom.
"-ffp-model={precizno,strogo,brzo}" - Pojednostavljuje pristup nizu specijalizovanih opcija za brojeve s pokretnim zarezom.
"-fpch-codegen" i "-fpch-debuginfo" za generiranje unaprijed kompajliranog zaglavlja (PCH) s odvojenim objektnim datotekama za kod i informacije o debuginfo.
“-fsanitize-coverage-allowlist” i “-fsanitize-coverage-blocklist” za provjeru pokrivenosti testiranjem bijele i crne liste.
“-mtls-size={12,24,32,48}” za odabir veličine TLS-a (thread-local storage).
"-menable-experimental-extension" za omogućavanje eksperimentalnih RISC-V ekstenzija.
Podrazumevani režim za C je "-fno-common", koji omogućava efikasniji pristup globalnim varijablama na nekim platformama.
Podrazumevana keš memorija modula je premještena iz /tmp u direktorij ~/.cache. Za poništavanje, možete koristiti oznaku “-fmodules-cache-path=”.
Standardni standard jezika C je ažuriran sa gnu11 na gnu17.
Dodata preliminarna podrška za GNU C ekstenziju "asm inline» za dodavanje asemblerskih umetaka. Ekstenzija se još uvijek analizira, ali se ni na koji način ne obrađuje.
Mogućnosti povezane sa OpenCL i CUDA podrškom su proširene. Dodata podrška za dijagnostiku blokova OpenCL 2.0 i implementirane nove mogućnosti OpenMP 5.0.
Dodata opcija IndentExternBlock uslužnom programu clang-format za poravnanje unutar extern "C" i extern "C++" blokova.
Statički analizator je poboljšao rukovanje naslijeđenim konstruktorima u C++. Dodane nove provjere alpha.core.C11Lock i alpha.fuchsia.Lock za provjeru brava, alpha.security.cert.pos.34c za otkrivanje nesigurne upotrebe putenv, webkit.NoUncountedMemberChecker i webkit.RefCntblBaseVirtualDtor za otkrivanje problema sa nebrojenim tipovima alpha .cplusplus .SmartPtr za provjeru nulte dereference pametnog pokazivača.
U linter zveket-uredno dodano veliki dio novih čekova.
Clangd server za keširanje (Clang Server) je poboljšao performanse i dodao nove dijagnostičke mogućnosti.
Sistem izgradnje je prebačen na korištenje Python 3. Ako Python 3 nije dostupan, moguće je vratiti se na korištenje Python 2.
Prednji kraj sa kompajlerom za jezik Go (llgo) je isključen iz izdanja, koje bi moglo biti restrukturirano u budućnosti.
Atribut vektor-funkcija-abi-varijanta je dodat u međureprezentaciju (IR) da bi se opisao mapiranje između skalarnih i vektorskih funkcija za vektorizaciju poziva. Od llvm::VectorType postoje dva odvojena tipa vektora llvm::FixedVectorType i llvm::ScalableVectorType.
Grananje zasnovano na udef vrijednostima i prosljeđivanje undef vrijednosti funkcijama standardne biblioteke prepoznaje se kao nedefinirano ponašanje. IN
memset/memcpy/memmove dozvoljava prosljeđivanje undef pokazivača, ali ako je parametar s veličinom nula.
LLJIT je dodao podršku za izvođenje statičkih inicijalizacija putem metoda LLJIT::initialize i LLJIT::deinitialize. Implementirana je mogućnost dodavanja statičkih biblioteka u JITDylib pomoću klase StaticLibraryDefinitionGenerator. Dodan C API za ORCv2 (API za izgradnju JIT kompajlera).
Podrška za Cortex-A64, Cortex-A34, Cortex-A77 i Cortex-X78 procesore dodata je u backend za AArch1 arhitekturu. Implementirane ekstenzije ARMv8.2-BF16 (BFloat16) i ARMv8.6-A, uključujući RMv8.6-ECV (poboljšana virtuelizacija brojača), ARMv8.6-FGT (fino zrnaste zamke), ARMv8.6-AMU (virtuelizacija monitora aktivnosti) i ARMv8.0-DGH (savjet za prikupljanje podataka). Osigurana je mogućnost generiranja koda za ugrađene funkcije-vezivanja za SVE vektorske instrukcije.
Podrška za Cortex-M55, Cortex-A77, Cortex-A78 i Cortex-X1 procesore dodata je u backend za ARM arhitekturu. Proširenja implementirana
Armv8.6-A Matrix Multiply i RMv8.2-AA32BF16 BFloat16.
Podrška za generisanje koda za POWER10 procesore dodata je u pozadinu za PowerPC arhitekturu. Optimizacije petlje su proširene, a podrška za pokretni zarez je poboljšana.
Pozadina za RISC-V arhitekturu dozvoljava prihvatanje zakrpa koje podržavaju eksperimentalne proširene skupove instrukcija koje još nisu zvanično odobrene.
Backend za AVR arhitekturu je prebačen iz eksperimentalne kategorije u stabilnu, uključenu u osnovnu distribuciju.
Backend za x86 arhitekturu podržava Intel AMX i TSXLDTRK instrukcije. Dodata zaštita od napada LVI (Ubacivanje vrijednosti učitavanja), a također implementira opći mehanizam za suzbijanje neželjenih efekata spekulativnog izvršenja za blokiranje napada uzrokovanih spekulativnim izvršavanjem operacija na CPU-u.
U backend-u za SystemZ arhitekturu, dodata je podrška za MemorySanitizer i LeakSanitizer.
Dodata podrška za datoteku zaglavlja sa matematičkim konstantama u Libc++ .
Prošireno LLD linker mogućnosti. Poboljšana podrška za ELF format, uključujući dodane opcije "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Dodata opcija "--time-trace" za spremanje traga u datoteku, koja se zatim može analizirati putem chrome://tracing interfejsa u Chromeu.