Izdanje LLVM 11.0 kompajlerskog paketa

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.

Poboljšanja u Clang 11.0:

  • 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".
  • Dodane nove zastavice kompajlera:
    • "-fstack-clash-protection" - omogućava zaštitu od sjecišta steka i gomile.
    • "-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.

Glavni inovacije LLVM 11.0:

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

izvor: opennet.ru

Dodajte komentar