Vydání sady kompilátorů LLVM 11.0

Po šesti měsících vývoje prezentovány vydání projektu LLVM 11.0 - Nástroje kompatibilní s GCC (kompilátory, optimalizátory a generátory kódu), které kompilují programy do středního bitového kódu virtuálních instrukcí podobných RISC (nízkoúrovňový virtuální stroj s víceúrovňovým optimalizačním systémem). Vygenerovaný pseudokód je možné převést JIT kompilátorem na strojové instrukce přímo v době provádění programu.

Klíčovou změnou v nové verzi bylo zahrnutí Přírubový, frontend pro jazyk Fortran. Flang podporuje Fortran 2018, OpenMP 4.5 a OpenACC 3.0, ale vývoj projektu ještě není dokončen a frontend se omezuje na parsování kódu a kontrolu jeho správnosti. Generování přechodného kódu LLVM zatím není podporováno a pro generování spustitelných souborů se generuje kanonický kód a předává se externímu kompilátoru Fortran.

Vylepšení v Clang 11.0:

  • Přidána možnost obnovit abstraktní strom syntaxe (AST) pro nesprávný kód C++, který lze použít k diagnostice chyb a poskytuje další informace pro externí nástroje, jako je clang-tidy a clangd. Tato funkce je standardně povolena pro kód C++ a ovládá se pomocí voleb "-Xclang -f[no-]recovery-ast".
  • Přidány nové diagnostické režimy:
    • "-Wpointer-to-int-cast" je skupina upozornění na přetypování ukazatelů na typ int typu integer, který neobsahuje všechny možné hodnoty.
    • "-Wuninitialized-const-reference" - upozornění na předávání neinicializovaných proměnných v parametrech funkcí, které přijímají referenční argumenty s atributem "const".
    • "-Wimplicit-const-int-float-conversion" je varování před implicitním převodem skutečné konstanty na celočíselný typ, který je ve výchozím nastavení povolen.
  • Pro platformu ARM jsou poskytovány funkce C vestavěné do kompilátoru (vnitřnosti) nahrazeny efektivními vektorovými instrukcemi Arm v8.1-M MVE a CDE. Dostupné funkce jsou definovány v hlavičkových souborech arm_mve.ha arm_cde.h.
  • Přidat sada rozšířených celočíselných typů _ExtInt(N), které umožňují vytvářet typy, které nejsou násobkem mocniny dvou, které lze efektivně zpracovat na FPGA / HLS. Například, _ExtInt(7) definuje celočíselný typ sestávající ze 7 bitů.
  • Přidána makra, která definují podporu pro vestavěné funkce C na základě instrukcí 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. Například makro __ARM_FEATURE_SVE je definováno při generování kódu AArch64 s nastavenou volbou příkazového řádku "-march=armv8-a+sve".

  • Příznak "-O" je nyní identifikován s režimem optimalizace "-O1" namísto "-O2".
  • Přidány nové příznaky kompilátoru:
    • "-fstack-clash-protection" - umožňuje ochranu proti průsečíky stohů a hromad.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - umožňuje vybrat režim obsluhy výjimek pro čísla s plovoucí desetinnou čárkou.
    • "-ffp-model={precise,strict,fast}" zjednodušuje přístup k řadě specializovaných voleb pro čísla s pohyblivou řádovou čárkou.
    • "-fpch-codegen" a "-fpch-debuginfo" pro generování předkompilované hlavičky (PCH) se samostatnými objektovými soubory pro kód a debuginfo.
    • "-fsanitize-coverage-allowlist" a "-fsanitize-coverage-blocklist" pro kontrolu testování pokrytí na whitelist a blacklist.
    • "-mtls-size={12,24,32,48}" pro výběr velikosti TLS (místní úložiště vláken).
    • "-menable-experimental-extension" pro povolení experimentálních rozšíření RISC-V.
  • Ve výchozím nastavení používá C režim "-fno-common", který umožňuje efektivnější přístup ke globálním proměnným na některých platformách.
  • Přesunuta výchozí mezipaměť modulu z /tmp do adresáře ~/.cache. K přepsání můžete použít příznak "-fmodules-cache-path=".
  • Výchozí standard C byl aktualizován z gnu11 na gnu17.
  • Přidána předběžná podpora pro rozšíření GNU C "asm linie» přidat vložky assembleru. Rozšíření je zatím pouze analyzováno, ale nijak zpracováno.
  • Rozšířené možnosti související s podporou OpenCL a CUDA. Přidána podpora pro diagnostiku bloků OpenCL 2.0 a implementovány nové funkce OpenMP 5.0.
  • Přidána možnost IndentExternBlock do nástroje formátu clang pro zarovnání uvnitř externích bloků "C" a externích "C++".
  • Vylepšené zpracování zděděných konstruktorů v C++ ve statickém analyzátoru. Přidány nové kontroly alpha.core.C11Lock a alpha.fuchsia.Lock pro kontrolu zámků, alpha.security.cert.pos.34c pro detekci nebezpečného použití putenv, webkit.NoUncountedMemberChecker a webkit.RefCntblBaseVirtualDtor pro detekci problémů s nesčetnými typy .cplusplus .SmartPtr pro kontrolu dereference nulového inteligentního ukazatele.
  • V linter cink-uklizený přidal velká část nových kontrol.
  • Caching server clangd (Clang Server) zlepšil výkon a přidal nové diagnostické možnosti.

hlavní inovace LLVM 11.0:

  • Systém sestavení byl přepnut na použití Pythonu 3. Pokud Python 3 není k dispozici, byla implementována možnost vrátit se k používání Pythonu 2.
  • Front-end s kompilátorem pro jazyk Go (llgo) byl vyloučen z vydání, které může být v budoucnu restrukturalizováno.
  • Atribut vector-function-abi-variant byl přidán do mezilehlé reprezentace (IR) k popisu mapování mezi skalárními a vektorovými funkcemi pro vektorizaci volání. Dva samostatné typy vektorů llvm::FixedVectorType a llvm::ScalableVectorType jsou odděleny od llvm::VectorType.
  • Považuje se za nedefinované chování větvení na základě hodnot udef a předávání hodnot undef do standardních funkcí knihovny. V
    memset/memcpy/memmove předávání ukazatelů undef je povoleno, ale pokud je parametr s velikostí nula.

  • LLJIT přidal podporu pro provádění statických inicializací pomocí metod LLJIT::initialize a LLJIT::deinitialize. Implementována možnost přidávat statické knihovny do JITDylib pomocí třídy StaticLibraryDefinitionGenerator. Přidáno C API pro ORCv2 (API pro vytváření JIT kompilátorů).
  • Do backendu architektury AArch64 byla přidána podpora pro procesory Cortex-A34, Cortex-A77, Cortex-A78 a Cortex-X1. Implementována rozšíření ARMv8.2-BF16 (BFloat16) a ARMv8.6-A, včetně RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (virtualizace Activity Monitors) a ARMv8.0-DGH (nápověda pro shromažďování dat). Je poskytována schopnost generovat kód pro vestavěné funkce zalamování pro vektorové instrukce SVE.
  • Do backendu architektury ARM byla přidána podpora pro procesory Cortex-M55, Cortex-A77, Cortex-A78 a Cortex-X1. Implementovaná rozšíření
    Armv8.6-A Matrix Multiply a RMv8.2-AA32BF16 BFloat16.

  • Do backendu architektury PowerPC byla přidána podpora generování kódu pro procesory POWER10. Rozšířená optimalizace smyček a vylepšená podpora operací s pohyblivou řádovou čárkou.
  • Backend pro architekturu RISC-V smí přijímat záplaty s podporou pro experimentální rozšířené instrukční sady, které ještě nebyly oficiálně schváleny.
  • Backend pro architekturu AVR byl přesunut z kategorie experimentálního do stabilního, který je součástí základního balíčku.
  • Backend pro architekturu x86 podporuje instrukce Intel AMX a TSXLDTRK. Přidána ochrana před útoky HVAC (Load Value Injection), stejně jako obecný mechanismus potlačení vedlejších efektů spekulativního provádění, je implementován k blokování útoků způsobených spekulativním prováděním operací v CPU.
  • Přidána podpora pro MemorySanitizer a LeakSanitizer v backendu SystemZ.
  • Do Libc++ byla přidána podpora hlavičkového souboru s matematickými konstantami .
  • Rozšířený Schopnosti linkeru LLD. Vylepšená podpora formátu ELF, včetně přidání "--lto-emit-asm", "--lto-whole-program-visibility", "--print-archive-stats", "--shuffle-sections", "-- thinlto- single-module", "--unique", "--rosegment", "--threads=N". Přidána možnost „--time-trace“ pro uložení trasování do souboru, který pak lze analyzovat prostřednictvím rozhraní chrome://tracing v prohlížeči Chrome.

Zdroj: opennet.ru

Přidat komentář