Vrijgave van de LLVM 11.0-compilersuite

Na zes maanden ontwikkeling ingediend project vrijgeven LLVM 11.0 — GCC-compatibele tools (compilers, optimizers en codegeneratoren), die programma's compileren in tussenbitcodes van RISC-achtige virtuele instructies (virtuele machine op laag niveau met een optimalisatiesysteem op meerdere niveaus). De gegenereerde pseudocode kan met behulp van een JIT-compiler direct tijdens de programma-uitvoering in machine-instructies worden omgezet.

De belangrijkste verandering in de nieuwe release was de opname van flens, frontend voor de Fortran-taal. Flang ondersteunt Fortran 2018, OpenMP 4.5 en OpenACC 3.0, maar de ontwikkeling van het project is nog niet voltooid en de front-end beperkt zich tot het parseren van code en het controleren op juistheid. Het genereren van tussenliggende LLVM-code wordt nog niet ondersteund en om uitvoerbare bestanden te genereren wordt canonieke code gegenereerd en doorgegeven aan een externe Fortran-compiler.

Verbeteringen in Clang 11.0:

  • De mogelijkheid toegevoegd om de abstracte syntaxisboom te herstellen (AST) voor kapotte C++-code, die kan worden gebruikt om fouten te diagnosticeren en aanvullende informatie biedt aan externe hulpprogramma's zoals clang-tidy en clangd. De functie is standaard ingeschakeld voor C++-code en wordt beheerd via de opties "-Xclang -f[no-]recovery-ast".
  • Nieuwe diagnostische modi toegevoegd:
    • “-Wpointer-to-int-cast” is een groep waarschuwingen over het casten van verwijzingen naar een geheel getaltype int dat niet alle mogelijke waarden herbergt.
    • “-Wuninitialized-const-reference” - waarschuwing over het doorgeven van niet-geïnitialiseerde variabelen in functieparameters die referentieargumenten accepteren met het attribuut “const”.
    • "-Wimplicit-const-int-float-conversion" - standaard ingeschakeld met waarschuwing over impliciete conversie van een echte constante naar een geheel getal.
  • Voor het ARM-platform zijn C-functies ingebouwd in de compiler aanwezig (Intrinsiek), vervangen door efficiënte vectorinstructies Arm v8.1-M MVE en CDE. De beschikbare functies worden gedefinieerd in de headerbestanden arm_mve.h en arm_cde.h.
  • toegevoegd een set uitgebreide integer-typen _ExtInt(N), waarmee u typen kunt maken die geen veelvouden van machten van twee zijn, die efficiënt kunnen worden verwerkt op FPGA/HLS. Bij voorbeeld, _ExtInt(7) definieert een geheel getaltype bestaande uit 7 bits.
  • Macro's toegevoegd die ondersteuning definiëren voor ingebouwde C-functies op basis van ARM SVE-instructies (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. De macro __ARM_FEATURE_SVE wordt bijvoorbeeld gedefinieerd bij het genereren van AArch64-code door de opdrachtregeloptie "-march=armv8-a+sve" in te stellen.

  • De vlag "-O" wordt nu geïdentificeerd met de optimalisatiemodus "-O1" in plaats van "-O2".
  • Nieuwe compilervlaggen toegevoegd:
    • "-fstack-clash-protection" - maakt bescherming mogelijk tegen snijpunten van stapel en hoop.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - hiermee kunt u de uitzonderingshandlermodus voor drijvende-kommagetallen selecteren.
    • "-ffp-model={precise,strict,fast}" - Vereenvoudigt de toegang tot een reeks gespecialiseerde opties voor drijvende-kommagetallen.
    • "-fpch-codegen" en "-fpch-debuginfo" om een ​​vooraf gecompileerde header (PCH) te genereren met afzonderlijke objectbestanden voor code en debuginfo.
    • “-fsanitize-coverage-allowlist” en “-fsanitize-coverage-blocklist” voor het controleren van de witte en zwarte lijsten voor dekkingstests.
    • “-mtls-size={12,24,32,48}” om de TLS-grootte (thread-local storage) te selecteren.
    • "-menable-experimental-extension" om experimentele RISC-V-extensies mogelijk te maken.
  • De standaardmodus voor C is "-fno-common", wat op sommige platforms een efficiëntere toegang tot globale variabelen mogelijk maakt.
  • De standaardmodulecache is verplaatst van /tmp naar de map ~/.cache. Om te overschrijven kunt u de vlag “-fmodules-cache-path=” gebruiken.
  • De standaard C-taalstandaard is bijgewerkt van gnu11 naar gnu17.
  • Voorlopige ondersteuning toegevoegd voor GNU C-extensie "asm inline» om assembler-inserts toe te voegen. De extensie wordt nog steeds geanalyseerd, maar op geen enkele manier verwerkt.
  • De mogelijkheden die verband houden met OpenCL- en CUDA-ondersteuning zijn uitgebreid. Ondersteuning toegevoegd voor OpenCL 2.0-blokdiagnostiek en nieuwe OpenMP 5.0-functies geïmplementeerd.
  • IndentExternBlock-optie toegevoegd aan het clang-format-hulpprogramma voor uitlijning binnen externe "C"- en externe "C++"-blokken.
  • De statische analysator heeft de verwerking van overgeërfde constructors in C++ verbeterd. Nieuwe controles toegevoegd alpha.core.C11Lock en alpha.fuchsia.Lock om te controleren op sloten, alpha.security.cert.pos.34c om onveilig gebruik van putenv te detecteren, webkit.NoUncountedMemberChecker en webkit.RefCntblBaseVirtualDtor om problemen met ontelbare typen te detecteren, alpha .cplusplus .SmartPtr om te controleren op nul-dereferentie van slimme aanwijzers.
  • In linter-kling-netjes toegevoegd een groot deel nieuwe cheques.
  • De clangd-cachingserver (Clang Server) heeft de prestaties verbeterd en nieuwe diagnostische mogelijkheden toegevoegd.

De belangrijkste innovaties LLVM 11.0:

  • Het bouwsysteem is overgeschakeld naar het gebruik van Python 3. Als Python 3 niet beschikbaar is, is het mogelijk om terug te keren naar het gebruik van Python 2.
  • De frontend met de compiler voor de Go-taal (llgo) is uitgesloten van de release, die in de toekomst mogelijk wordt geherstructureerd.
  • Het vector-function-abi-variant attribuut is toegevoegd aan de tussenliggende representatie (IR) om de mapping tussen scalaire en vectorfuncties te beschrijven om oproepen te vectoriseren. Van llvm::VectorType zijn er twee afzonderlijke vectortypen llvm::FixedVectorType en llvm::ScalableVectorType.
  • Het vertakken op basis van udef-waarden en het doorgeven van undef-waarden aan standaardbibliotheekfuncties wordt herkend als ongedefinieerd gedrag. IN
    memset/memcpy/memmove staat het doorgeven van undef-pointers toe, maar als de parameter met size nul is.

  • LLJIT heeft ondersteuning toegevoegd voor het uitvoeren van statische initialisaties via de methoden LLJIT::initialize en LLJIT::deinitialize. De mogelijkheid om statische bibliotheken aan JITDylib toe te voegen met behulp van de klasse StaticLibraryDefinitionGenerator is geïmplementeerd. C-API toegevoegd voor ORCv2 (API voor het bouwen van JIT-compilers).
  • Ondersteuning voor Cortex-A64-, Cortex-A34-, Cortex-A77- en Cortex-X78-processors is toegevoegd aan de backend voor de AArch1-architectuur. Geïmplementeerde ARMv8.2-BF16 (BFloat16) en ARMv8.6-A-extensies, waaronder RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualisatie) en ARMv8.0-DGH (tip voor gegevensverzameling). Er wordt voorzien in de mogelijkheid om code te genereren voor ingebouwde functiebindingen met SVE-vectorinstructies.
  • Ondersteuning voor Cortex-M55-, Cortex-A77-, Cortex-A78- en Cortex-X1-processors is toegevoegd aan de backend voor de ARM-architectuur. Uitbreidingen geïmplementeerd
    Armv8.6-A Matrix Vermenigvuldigen en RMv8.2-AA32BF16 BFloat16.

  • Ondersteuning voor het genereren van code voor POWER10-processors is toegevoegd aan de backend voor de PowerPC-architectuur. De lusoptimalisaties zijn uitgebreid en de ondersteuning voor drijvende komma's is verbeterd.
  • De backend voor de RISC-V-architectuur maakt de acceptatie mogelijk van patches die experimentele uitgebreide instructiesets ondersteunen die nog niet officieel zijn goedgekeurd.
  • De backend voor de AVR-architectuur is overgebracht van de experimentele categorie naar stabiel, opgenomen in de basisdistributie.
  • De backend voor x86-architectuur ondersteunt Intel AMX- en TSXLDTRK-instructies. Extra bescherming tegen aanvallen HVAC (Load Value Injection), en implementeert ook een algemeen mechanisme voor het onderdrukken van bijwerkingen bij speculatieve uitvoering om aanvallen te blokkeren die worden veroorzaakt door speculatieve uitvoering van bewerkingen op de CPU.
  • In de backend voor de SystemZ-architectuur is ondersteuning voor MemorySanitizer en LeakSanitizer toegevoegd.
  • Ondersteuning toegevoegd voor headerbestand met wiskundige constanten aan Libc++ .
  • Uitgebreid LLD-linkermogelijkheden. Verbeterde ondersteuning voor het ELF-formaat, inclusief de toevoeging van opties “--lto-emit-asm”, “--lto-whole-program-visibility”, “-print-archive-stats”, “-shuffle-sections”, “-thinlto-single-module", "-unique", "-rosegment", "-threads=N". Optie "--time-trace" toegevoegd om de tracering in een bestand op te slaan, dat vervolgens kan worden geanalyseerd via de chrome://tracing-interface in Chrome.

Bron: opennet.ru

Voeg een reactie