Vydanie sady kompilátorov LLVM 11.0

Po šiestich mesiacoch vývoja predložené vydanie projektu LLVM 11.0 — Nástroje kompatibilné s GCC (kompilátory, optimalizátory a generátory kódu), kompilujúce programy do stredného bitového kódu virtuálnych inštrukcií podobných RISC (nízkoúrovňový virtuálny stroj s viacúrovňovým optimalizačným systémom). Vygenerovaný pseudokód je možné previesť pomocou JIT kompilátora na strojové inštrukcie priamo v čase vykonávania programu.

Kľúčovou zmenou v novom vydaní bolo zahrnutie Flank, frontend pre jazyk Fortran. Flang podporuje Fortran 2018, OpenMP 4.5 a OpenACC 3.0, ale vývoj projektu ešte nebol dokončený a frontend je obmedzený na analýzu kódu a kontrolu správnosti. Generovanie prechodného kódu LLVM ešte nie je podporované a na generovanie spustiteľných súborov sa generuje kanonický kód a odovzdáva sa externému kompilátoru Fortran.

Vylepšenia v Clang 11.0:

  • Pridaná možnosť obnoviť abstraktný strom syntaxe (AST) pre nefunkčný kód C++, ktorý možno použiť na pomoc pri diagnostike chýb a poskytuje dodatočné informácie externým nástrojom, ako sú clang-tidy a clangd. Táto funkcia je štandardne povolená pre kód C++ a je ovládaná cez možnosti "-Xclang -f[no-]recovery-ast".
  • Pridané nové diagnostické režimy:
    • „-Wpointer-to-int-cast“ je skupina upozornení na pretypovanie ukazovateľov na celočíselný typ int, ktorý nevyhovuje všetkým možným hodnotám.
    • „-Wuninitialized-const-reference“ – varovanie pred odovzdaním neinicializovaných premenných v parametroch funkcií, ktoré akceptujú argumenty odkazu s atribútom „const“.
    • "-Wimplicit-const-int-float-conversion" - predvolene zapnuté upozornenie na implicitnú konverziu reálnej konštanty na typ celého čísla.
  • Pre platformu ARM sú poskytované funkcie C zabudované do kompilátora (Vnútornosti), nahradené efektívnymi vektorovými inštrukciami Arm v8.1-M MVE a CDE. Dostupné funkcie sú definované v hlavičkových súboroch arm_mve.h a arm_cde.h.
  • Pridané množina rozšírených celočíselných typov _ExtInt(N), ktorá vám umožňuje vytvárať typy, ktoré nie sú násobkami mocniny dvoch, ktoré možno efektívne spracovať na FPGA/HLS. Napríklad, _ExtInt(7) definuje celočíselný typ pozostávajúci zo 7 bitov.
  • Pridané makrá, ktoré definujú podporu pre vstavané funkcie C založené na pokynoch 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. Napríklad makro __ARM_FEATURE_SVE je definované pri generovaní kódu AArch64 nastavením voľby príkazového riadka "-march=armv8-a+sve".

  • Príznak "-O" je teraz identifikovaný s režimom optimalizácie "-O1" namiesto "-O2".
  • Pridané nové príznaky kompilátora:
    • "-fstack-clash-protection" - umožňuje ochranu proti priesečníky stohu a haldy.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - umožňuje vám vybrať režim obsluhy výnimiek pre čísla s pohyblivou rádovou čiarkou.
    • "-ffp-model={precise,strict,fast}" - Zjednodušuje prístup k sérii špecializovaných možností pre čísla s pohyblivou rádovou čiarkou.
    • "-fpch-codegen" a "-fpch-debuginfo" na vygenerovanie predkompilovanej hlavičky (PCH) so samostatnými objektovými súbormi pre kód a debuginfo.
    • „-fsanitize-coverage-allowlist“ a „-fsanitize-coverage-blocklist“ na kontrolu bielej a čiernej listiny testovania pokrytia.
    • “-mtls-size={12,24,32,48}” na výber veľkosti TLS (miestneho úložiska vlákna).
    • "-menable-experimental-extension" na povolenie experimentálnych RISC-V rozšírení.
  • Predvolený režim pre C je "-fno-common", ktorý umožňuje efektívnejší prístup ku globálnym premenným na niektorých platformách.
  • Predvolená vyrovnávacia pamäť modulu bola presunutá z /tmp do adresára ~/.cache. Na prepísanie môžete použiť príznak “-fmodules-cache-path=”.
  • Predvolený štandard jazyka C bol aktualizovaný z gnu11 na gnu17.
  • Pridaná predbežná podpora pre rozšírenie GNU C "asm inline» na pridanie vložiek assemblera. Rozšírenie sa stále analyzuje, ale nie je žiadnym spôsobom spracované.
  • Možnosti spojené s podporou OpenCL a CUDA boli rozšírené. Pridaná podpora pre diagnostiku blokov OpenCL 2.0 a implementované nové funkcie OpenMP 5.0.
  • Do obslužného programu formátu clang bola pridaná možnosť IndentExternBlock na zarovnanie v rámci externých blokov „C“ a externých „C++“.
  • Statický analyzátor zlepšil prácu so zdedenými konštruktormi v C++. Pridané nové kontroly alpha.core.C11Lock a alpha.fuchsia.Lock na kontrolu zámkov, alpha.security.cert.pos.34c na zistenie nebezpečného použitia putenv, webkit.NoUncountedMemberChecker a webkit.RefCntblBaseVirtualDtor na detekciu problémov s nespočetnými typmi .cplusplus .SmartPtr na kontrolu dereferencie nulového inteligentného ukazovateľa.
  • V linter cink-uprataný pridané veľkú časť nových šekov.
  • Clangd caching server (Clang Server) zlepšil výkon a pridal nové diagnostické možnosti.

Hlavné inovácie LLVM 11.0:

  • Zostavovací systém bol prepnutý na používanie Pythonu 3. Ak Python 3 nie je dostupný, je možné vrátiť sa späť na používanie Pythonu 2.
  • Frontend s kompilátorom pre jazyk Go (llgo) je vylúčený z vydania, ktoré môže byť v budúcnosti reštrukturalizované.
  • Atribút vector-function-abi-variant bol pridaný do intermediárnej reprezentácie (IR) na opis mapovania medzi skalárnymi a vektorovými funkciami na vektorizáciu hovorov. Z llvm::VectorType existujú dva samostatné typy vektorov llvm::FixedVectorType a llvm::ScalableVectorType.
  • Vetvenie založené na hodnotách udef a odovzdávanie hodnôt undef do štandardných knižničných funkcií sa považuje za nedefinované správanie. IN
    memset/memcpy/memmove umožňuje odovzdávanie ukazovateľov undef, ale ak je parameter s veľkosťou nula.

  • LLJIT pridal podporu pre vykonávanie statických inicializácií prostredníctvom metód LLJIT::initialize a LLJIT::deinitialize. Schopnosť pridať statické knižnice do JITDylib pomocou triedy StaticLibraryDefinitionGenerator bola implementovaná. Pridané C API pre ORCv2 (API pre zostavovanie JIT kompilátorov).
  • Do backendu pre architektúru AArch64 bola pridaná podpora pre procesory Cortex-A34, Cortex-A77, Cortex-A78 a Cortex-X1. Implementované rozšírenia ARMv8.2-BF16 (BFloat16) a ARMv8.6-A vrátane RMv8.6-ECV (vylepšená virtualizácia čítača), ARMv8.6-FGT (jemne zrnité pasce), ARMv8.6-AMU (virtualizácia monitorov aktivity) a ARMv8.0-DGH (návod na zhromažďovanie údajov). Poskytuje sa schopnosť generovať kód pre vstavané funkcie - väzby na vektorové inštrukcie SVE.
  • Do backendu pre architektúru ARM bola pridaná podpora pre procesory Cortex-M55, Cortex-A77, Cortex-A78 a Cortex-X1. Implementované rozšírenia
    Armv8.6-A Matrix Multiply a RMv8.2-AA32BF16 BFloat16.

  • Podpora generovania kódu pre procesory POWER10 bola pridaná do backendu pre architektúru PowerPC. Optimalizácia slučiek bola rozšírená a podpora s pohyblivou rádovou čiarkou bola vylepšená.
  • Backend pre architektúru RISC-V umožňuje akceptovanie opráv, ktoré podporujú experimentálne rozšírené inštrukčné sady, ktoré ešte neboli oficiálne schválené.
  • Backend pre architektúru AVR bol presunutý z experimentálnej kategórie do stabilnej, zaradenej do základnej distribúcie.
  • Backend pre architektúru x86 podporuje inštrukcie Intel AMX a TSXLDTRK. Pridaná ochrana proti útokom LVI (Load Value Injection) a tiež implementuje všeobecný mechanizmus potlačenia vedľajších účinkov špekulatívneho vykonávania na blokovanie útokov spôsobených špekulatívnym vykonávaním operácií na CPU.
  • V backende pre architektúru SystemZ bola pridaná podpora pre MemorySanitizer a LeakSanitizer.
  • Pridaná podpora pre hlavičkový súbor s matematickými konštantami do Libc++ .
  • Rozšírené Schopnosti LLD linkeru. Vylepšená podpora pre formát ELF vrátane pridaných možností "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Pridaná možnosť „--time-trace“ na uloženie sledovania do súboru, ktorý potom možno analyzovať cez rozhranie chrome://tracing v prehliadači Chrome.

Zdroj: opennet.ru

Pridať komentár