Izdaja zbirke prevajalnikov LLVM 11.0

Po šestih mesecih razvoja predstavljeno izdaja projekta LLVM 11.0 - Orodja, združljiva z GCC (prevajalniki, optimizatorji in generatorji kode), ki prevajajo programe v vmesno bitno kodo virtualnih navodil, podobnih RISC (nizkonivojski virtualni stroj z večnivojskim optimizacijskim sistemom). Ustvarjeno psevdo kodo lahko prevajalnik JIT pretvori v strojna navodila takoj ob izvajanju programa.

Ključna sprememba v novi izdaji je bila vključitev prirobnica, vmesnik za jezik Fortran. Flang podpira Fortran 2018, OpenMP 4.5 in OpenACC 3.0, vendar razvoj projekta še ni zaključen in je frontend omejen na razčlenjevanje kode in preverjanje njene pravilnosti. Generiranje vmesne kode LLVM še ni podprto in za generiranje izvršljivih datotek se generira kanonična koda in posreduje zunanjemu prevajalniku Fortran.

Izboljšave v Clang 11.0:

  • Dodana možnost obnovitve drevesa abstraktne sintakse (AST) za nepravilno kodo C++, ki se lahko uporablja za pomoč pri diagnosticiranju napak in zagotavlja dodatne informacije za zunanje pripomočke, kot sta clang-tidy in clangd. Funkcija je privzeto omogočena za kodo C++ in je nadzorovana prek možnosti »-Xclang -f[no-]recovery-ast«.
  • Dodani novi diagnostični načini:
    • "-Wpointer-to-int-cast" je skupina opozoril o predvajanju kazalcev na celoštevilski tip int, ki ne vsebuje vseh možnih vrednosti.
    • "-Wuninitialized-const-reference" - opozorilo o posredovanju neinicializiranih spremenljivk v funkcijskih parametrih, ki sprejemajo referenčne argumente z atributom "const".
    • "-Wimplicit-const-int-float-conversion" je opozorilo o implicitni pretvorbi realne konstante v vrsto celega števila, ki je privzeto omogočeno.
  • Za platformo ARM so na voljo funkcije C, vgrajene v prevajalnik (intrinzične lastnosti) nadomeščajo učinkovita vektorska navodila Arm v8.1-M MVE in CDE. Razpoložljive funkcije so definirane v datotekah glave arm_mve.h in arm_cde.h.
  • Dodano nabor razširjenih celih tipov _ExtInt(N), ki vam omogočajo ustvarjanje tipov, ki niso večkratnik potence dva, ki jih je mogoče učinkovito obdelati na FPGA / HLS. Na primer, _ExtInt(7) definira celoštevilski tip, sestavljen iz 7 bitov.
  • Dodani makri, ki definirajo podporo za vgrajene funkcije C na podlagi navodil 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 primer, makro __ARM_FEATURE_SVE je definiran pri generiranju kode AArch64 z nastavljeno možnostjo ukazne vrstice "-march=armv8-a+sve".

  • Zastavica "-O" je zdaj identificirana z načinom optimizacije "-O1" namesto z "-O2".
  • Dodane nove zastavice prevajalnika:
    • "-fstack-clash-protection" - omogoča zaščito pred presečišča skladov in kopic.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - omogoča izbiro načina obravnave izjem za števila s plavajočo vejico.
    • "-ffp-model={precise,strict,fast}" poenostavlja dostop do vrste specializiranih možnosti za števila s plavajočo vejico.
    • "-fpch-codegen" in "-fpch-debuginfo" za ustvarjanje vnaprej prevedene glave (PCH) z ločenimi objektnimi datotekami za kodo in debuginfo.
    • »-fsanitize-coverage-allowlist« in »-fsanitize-coverage-blocklist« za preverjanje testiranja pokritosti seznama dovoljenih in črnih seznamov.
    • "-mtlsize={12,24,32,48}", da izberete velikost TLS (lokalni pomnilnik niti).
    • "-menable-experimental-extension", da omogoči eksperimentalne razširitve RISC-V.
  • C privzeto uporablja način "-fno-common", ki omogoča učinkovitejši dostop do globalnih spremenljivk na nekaterih platformah.
  • Privzeti predpomnilnik modula je bil premaknjen iz /tmp v imenik ~/.cache. Za preglasitev lahko uporabite zastavico "-fmodules-cache-path=".
  • Privzeti standard C je bil posodobljen iz gnu11 v gnu17.
  • Dodana predhodna podpora za razširitev GNU C "asm linija» za dodajanje vstavkov za asembler. Razširitev je zaenkrat samo razčlenjena, nikakor pa ni obdelana.
  • Razširjene zmogljivosti, povezane s podporo za OpenCL in CUDA. Dodana podpora za diagnostiko blokov OpenCL 2.0 in implementirane nove funkcije OpenMP 5.0.
  • Dodana možnost IndentExternBlock pripomočku za klang-format za poravnavo znotraj blokov extern "C" in extern "C++".
  • Izboljšano ravnanje s podedovanimi konstruktorji v C++ v statičnem analizatorju. Dodana nova preverjanja alpha.core.C11Lock in alpha.fuchsia.Lock za preverjanje zaklepanja, alpha.security.cert.pos.34c za odkrivanje nevarne uporabe putenv, webkit.NoUncountedMemberChecker in webkit.RefCntblBaseVirtualDtor za odkrivanje težav z neštetimi vrstami, alpha .cplusplus .SmartPtr za preverjanje ničelne dereference pametnega kazalca.
  • V linterju žvenketajoče dodano velik del novih čekov.
  • Strežnik za predpomnjenje clangd (Clang Server) ima izboljšano zmogljivost in dodane nove diagnostične zmožnosti.

Glavni inovacije LLVM 11.0:

  • Sistem gradnje je bil preklopljen na uporabo Python 3. Če Python 3 ni na voljo, je bila implementirana možnost povrnitve na uporabo Python 2.
  • Sprednji del s prevajalnikom za jezik Go (llgo) je izključen iz izdaje, ki bo morda v prihodnosti prestrukturiran.
  • Vmesni predstavitvi (IR) je bil dodan atribut abi-variant vektorske funkcije za opis preslikave med skalarnimi in vektorskimi funkcijami za vektorizacijo klicev. Dva ločena vektorska tipa llvm::FixedVectorType in llvm::ScalableVectorType sta ločena od llvm::VectorType.
  • Razvejanje na podlagi vrednosti udef in posredovanje vrednosti undef standardnim funkcijam knjižnice velja za nedefinirano vedenje. IN
    memset/memcpy/memmove podajanje kazalcev undef je dovoljeno, vendar če je parameter z velikostjo nič.

  • LLJIT je dodal podporo za izvajanje statičnih inicializacij prek metod LLJIT::initialize in LLJIT::deinitialize. Implementirana možnost dodajanja statičnih knjižnic v JITDylib z uporabo razreda StaticLibraryDefinitionGenerator. Dodan C API za ORCv2 (API za izdelavo prevajalnikov JIT).
  • Dodana podpora za procesorje Cortex-A64, Cortex-A34, Cortex-A77 in Cortex-X78 v ozadju arhitekture AArch1. Implementirane razširitve ARMv8.2-BF16 (BFloat16) in ARMv8.6-A, vključno z RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) in ARMv8.0-DGH (namig za zbiranje podatkov). Zagotovljena je možnost generiranja kode za vgrajene funkcije ovijanja za vektorska navodila SVE.
  • Podpora za procesorje Cortex-M55, Cortex-A77, Cortex-A78 in Cortex-X1 je bila dodana v ozadje arhitekture ARM. Implementirane razširitve
    Armv8.6-A Matrix Multiply in RMv8.2-AA32BF16 BFloat16.

  • Dodana podpora za ustvarjanje kode za procesorje POWER10 v zaledju arhitekture PowerPC. Razširjene optimizacije zanke in izboljšana podpora za operacije s plavajočo vejico.
  • Zaledju za arhitekturo RISC-V je dovoljeno sprejemati popravke s podporo za eksperimentalne razširjene nize navodil, ki še niso bili uradno odobreni.
  • Zaledje za arhitekturo AVR je bilo premaknjeno iz kategorije poskusnega v stabilno, vključeno v osnovni paket.
  • Zaledje za arhitekturo x86 podpira navodila Intel AMX in TSXLDTRK. Dodana zaščita pred napadi HVAC (Load Value Injection), kot tudi splošni mehanizem za preprečevanje stranskih učinkov špekulativnega izvajanja je implementiran za blokiranje napadov, ki jih povzroči špekulativno izvajanje operacij v CPE.
  • Dodana podpora za MemorySanitizer in LeakSanitizer v zaledju SystemZ.
  • V Libc++ je bila dodana podpora za datoteko glave z matematičnimi konstantami .
  • Razširjeno Zmogljivosti povezovalnika LLD. Izboljšana podpora za format ELF, vključno z dodajanjem "--lto-emit-asm", "--lto-whole-program-visibility", "--print-archive-stats", "--shuffle-sections", "-- thinlto- single-module", "--unique", "--rosegment", "--threads=N". Dodana možnost »--time-trace« za shranjevanje sledi v datoteko, ki jo je nato mogoče analizirati prek vmesnika chrome://tracing v Chromu.

Vir: opennet.ru

Dodaj komentar