Izdanje paketa prevoditelja LLVM 11.0

Nakon šest mjeseci razvoja predstavio izdanje projekta LLVM 11.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.

Ključna promjena u novom izdanju bilo je uključivanje Bok, sučelje za jezik Fortran. Flang podržava Fortran 2018, OpenMP 4.5 i OpenACC 3.0, ali razvoj projekta još nije dovršen i front end je ograničen na parsiranje koda i provjeru ispravnosti. Generiranje međukoda LLVM još nije podržano, a za generiranje izvršnih datoteka generira se kanonski kod i prosljeđuje vanjskom Fortran kompajleru.

Poboljšanja u Clangu 11.0:

  • Dodana mogućnost vraćanja stabla apstraktne sintakse (AST) za pokvareni C++ kod, koji se može koristiti za pomoć pri dijagnosticiranju pogrešaka i pruža dodatne informacije vanjskim uslužnim programima kao što su clang-tidy i clangd. Značajka je omogućena prema zadanim postavkama za C++ kod i kontrolira se putem opcija "-Xclang -f[no-]recovery-ast".
  • Dodani novi dijagnostički načini:
    • “-Wpointer-to-int-cast” je skupina upozorenja o ubacivanju pokazivača na cjelobrojni tip int koji ne prihvaća sve moguće vrijednosti.
    • “-Wuninitialized-const-reference” - upozorenje o prosljeđivanju neinicijaliziranih varijabli u parametrima funkcije koji prihvaćaju referentne argumente s atributom “const”.
    • "-Wimplicit-const-int-float-conversion" - omogućeno prema zadanim postavkama upozorenje o implicitnoj konverziji realne konstante u cjelobrojni tip.
  • Za ARM platformu dostupne su C funkcije ugrađene u kompajler (Intrinzike), zamijenjen učinkovitim vektorskim uputama 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ćuju stvaranje tipova koji nisu višestruki potencije broja dva, a koji se mogu učinkovito obraditi na FPGA/HLS. Na primjer, _ExtInt(7) definira cjelobrojni tip koji se sastoji od 7 bitova.
  • Dodane makronaredbe koje definiraju podršku za ugrađene C funkcije na temelju uputa ARM SVE (Scalable Vector Extension):
    __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, makronaredba __ARM_FEATURE_SVE definirana je prilikom generiranja AArch64 koda postavljanjem opcije retka za naredbe "-march=armv8-a+sve".

  • Oznaka "-O" sada se identificira s načinom optimizacije "-O1" umjesto s "-O2".
  • Dodane su nove oznake prevoditelja:
    • "-fstack-clash-protection" - omogućuje zaštitu od sjecišta hrpe i hrpe.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - omogućuje odabir načina obrade izuzetaka za brojeve s pomičnim zarezom.
    • "-ffp-model={precise,strict,fast}" - Pojednostavljuje pristup nizu specijaliziranih opcija za brojeve s pomičnim zarezom.
    • "-fpch-codegen" i "-fpch-debuginfo" za generiranje unaprijed kompajliranog zaglavlja (PCH) s zasebnim objektnim datotekama za kod i informacije o otklanjanju pogrešaka.
    • “-fsanitize-coverage-allowlist” i “-fsanitize-coverage-blocklist” za provjeru testiranja pokrivenosti bijelim i crnim popisima.
    • “-mtlsize={12,24,32,48}” za odabir TLS (lokalne pohrane niti) veličine.
    • "-menable-experimental-extension" za omogućavanje eksperimentalnih RISC-V proširenja.
  • Zadani način za C je "-fno-common", koji omogućuje učinkovitiji pristup globalnim varijablama na nekim platformama.
  • Zadana predmemorija modula premještena je iz /tmp u direktorij ~/.cache. Za nadjačavanje možete upotrijebiti oznaku “-fmodules-cache-path=”.
  • Zadani standard jezika C ažuriran je s gnu11 na gnu17.
  • Dodana preliminarna podrška za GNU C proširenje "asm inline» za dodavanje asemblerskih umetaka. Ekstenzija se još uvijek analizira, ali se ni na koji način ne obrađuje.
  • Proširene su mogućnosti povezane s podrškom za OpenCL i CUDA. Dodana podrška za dijagnostiku blokova OpenCL 2.0 i implementirane nove značajke OpenMP 5.0.
  • Dodana opcija IndentExternBlock uslužnom programu za klang format za poravnanje unutar extern "C" i extern "C++" blokova.
  • Statički analizator poboljšao je rukovanje naslijeđenim konstruktorima u C++. Dodane su nove provjere alpha.core.C11Lock i alpha.fuchsia.Lock za provjeru zaključavanja, alpha.security.cert.pos.34c za otkrivanje nesigurne upotrebe putenv, webkit.NoUncountedMemberChecker i webkit.RefCntblBaseVirtualDtor za otkrivanje problema s nebrojenim vrstama, alpha .cplusplus .SmartPtr za provjeru nulte dereferencije pametnog pokazivača.
  • U linteru zveket-uredan dodao velik dio novih čekova.
  • Clangd poslužitelj za predmemoriju (Clang Server) poboljšao je performanse i dodao nove dijagnostičke mogućnosti.

Glavni inovacije LLVM 11.0:

  • Sustav izrade je prebačen na korištenje Pythona 3. Ako Python 3 nije dostupan, moguće je vratiti se na korištenje Pythona 2.
  • Sučelje s kompajlerom za jezik Go (llgo) isključeno je iz izdanja, koje bi u budućnosti moglo biti restrukturirano.
  • Atribut abi-varijante vektorske funkcije dodan je srednjem prikazu (IR) za opisivanje preslikavanja između skalarnih i vektorskih funkcija za vektorizaciju poziva. Od llvm::VectorType postoje dvije odvojene vrste vektora llvm::FixedVectorType i llvm::ScalableVectorType.
  • Grananje na temelju udef vrijednosti i prosljeđivanje undef vrijednosti standardnim funkcijama knjižnice prepoznaje se kao nedefinirano ponašanje. U
    memset/memcpy/memmove dopušta 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 izradu JIT prevodilaca).
  • Podrška za Cortex-A64, Cortex-A34, Cortex-A77 i Cortex-X78 procesore dodana je u pozadinu za AArch1 arhitekturu. Implementirana proširenja ARMv8.2-BF16 (BFloat16) i ARMv8.6-A, uključujući RMv8.6-ECV (poboljšana virtualizacija brojača), ARMv8.6-FGT (fino zrnate zamke), ARMv8.6-AMU (virtualizacija monitora aktivnosti) i ARMv8.0-DGH (naputak za prikupljanje podataka). Omogućena je mogućnost generiranja koda za ugrađene funkcije-vezivanja na SVE vektorske instrukcije.
  • Podrška za procesore Cortex-M55, Cortex-A77, Cortex-A78 i Cortex-X1 dodana je u pozadinu za ARM arhitekturu. Implementirana proširenja
    Armv8.6-A Matrix Multiply i RMv8.2-AA32BF16 BFloat16.

  • Podrška za generiranje koda za POWER10 procesore dodana 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 dopušta prihvaćanje zakrpa koje podržavaju eksperimentalne proširene skupove instrukcija koje još nisu službeno odobrene.
  • Pozadina za AVR arhitekturu prebačena je iz eksperimentalne kategorije u stabilnu, uključenu u osnovnu distribuciju.
  • Pozadina za x86 arhitekturu podržava Intel AMX i TSXLDTRK upute. Dodana zaštita od napada LVI (Load Value Injection), a također implementira opći mehanizam suzbijanja nuspojava spekulativnog izvršenja za blokiranje napada uzrokovanih spekulativnim izvršavanjem operacija na CPU-u.
  • U pozadini za SystemZ arhitekturu dodana je podrška za MemorySanitizer i LeakSanitizer.
  • Dodana podrška za datoteku zaglavlja s matematičkim konstantama u Libc++ .
  • Prošireno Mogućnosti LLD povezivača. 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". Dodana je opcija "--time-trace" za spremanje praćenja u datoteku, koja se zatim može analizirati putem sučelja chrome://tracing u Chromeu.

Izvor: opennet.ru

Dodajte komentar