Udgivelse af LLVM 11.0 compiler suite

Efter seks måneders udvikling præsenteret projektudgivelse LLVM 11.0 — GCC-kompatible værktøjer (kompilatorer, optimeringsværktøjer og kodegeneratorer), kompilering af programmer til mellembitcode af RISC-lignende virtuelle instruktioner (virtuel maskine på lavt niveau med et optimeringssystem på flere niveauer). Den genererede pseudokode kan konverteres ved hjælp af en JIT-kompiler til maskininstruktioner direkte på tidspunktet for programudførelse.

Den vigtigste ændring i den nye udgivelse var medtagelsen af Flange, en frontend til Fortran-sproget. Flang understøtter Fortran 2018, OpenMP 4.5 og OpenACC 3.0, men udviklingen af ​​projektet er endnu ikke afsluttet, og frontenden er begrænset til kodeparsing og kontrol for korrekthed. Generering af LLVM-mellemkode er endnu ikke understøttet, og for at generere eksekverbare filer, genereres kanonisk kode og sendes til en ekstern Fortran-kompiler.

Forbedringer i Clang 11.0:

  • Tilføjet muligheden for at gendanne det abstrakte syntakstræ (AST) for brudt C++-kode, som kan bruges til at hjælpe med at diagnosticere fejl og giver yderligere oplysninger til eksterne hjælpeprogrammer såsom clang-tidy og clangd. Funktionen er aktiveret som standard for C++ kode og styres gennem "-Xclang -f[no-]recovery-ast" mulighederne.
  • Tilføjet nye diagnostiske tilstande:
    • "-Wpointer-to-int-cast" er en gruppe advarsler om casting af pointere til en heltalstype int, der ikke rummer alle mulige værdier.
    • "-Wuninitialized-const-reference" - advarsel om at sende ikke-initialiserede variabler i funktionsparametre, der accepterer referenceargumenter med "const"-attributten.
    • "-Wimplicit-const-int-float-conversion" - aktiveret som standard advarsel om implicit konvertering af en reel konstant til en heltalstype.
  • Til ARM-platformen leveres C-funktioner indbygget i compileren (Iboende), erstattet af effektive vektorinstruktioner Arm v8.1-M MVE og CDE. De tilgængelige funktioner er defineret i header-filerne arm_mve.h og arm_cde.h.
  • Tilføjet et sæt udvidede heltalstyper _ExtInt(N), der giver dig mulighed for at oprette typer, der ikke er multipla af potenser af to, som effektivt kan behandles på FPGA/HLS. For eksempel, _ExtInt(7) definerer en heltalstype bestående af 7 bit.
  • Tilføjede makroer, der definerer understøttelse af indbyggede C-funktioner baseret på ARM SVE (Scalable Vector Extension) instruktioner:
    __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. For eksempel defineres makroen __ARM_FEATURE_SVE ved generering af AArch64-kode ved at indstille kommandolinjeindstillingen "-march=armv8-a+sve".

  • "-O"-flaget er nu identificeret med "-O1"-optimeringstilstanden i stedet for "-O2".
  • Tilføjet nye compilerflag:
    • "-fstack-clash-protection" - muliggør beskyttelse mod skæringspunkter mellem stak og heap.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - giver dig mulighed for at vælge undtagelseshåndteringstilstanden for flydende kommatal.
    • "-ffp-model={præcis,streng,hurtig}" - Forenkler adgangen til en række specialiserede muligheder for flydende kommatal.
    • "-fpch-codegen" og "-fpch-debuginfo" for at generere en prækompileret header (PCH) med separate objektfiler til kode og debuginfo.
    • "-fsanitize-coverage-allowlist" og "-fsanitize-coverage-blocklist" til kontrol af dækningstest hvide og sorte lister.
    • "-mtls-size={12,24,32,48}" for at vælge TLS-størrelsen (tråd-lokal lagring).
    • "-menable-experimental-extension" for at aktivere eksperimentelle RISC-V-udvidelser.
  • Standardtilstanden for C er "-fno-common", som giver mulighed for mere effektiv adgang til globale variabler på nogle platforme.
  • Standardmodulets cache er blevet flyttet fra /tmp til mappen ~/.cache. For at tilsidesætte kan du bruge flaget "-fmodules-cache-path=".
  • Standard C-sprogstandarden er blevet opdateret fra gnu11 til gnu17.
  • Tilføjet foreløbig support til GNU C-udvidelse "asm inline» for at tilføje assembler-indsatser. Udvidelsen er stadig ved at blive analyseret, men behandles ikke på nogen måde.
  • Mulighederne forbundet med OpenCL og CUDA support er blevet udvidet. Tilføjet understøttelse af OpenCL 2.0 blokdiagnostik og implementeret nye OpenMP 5.0 funktioner.
  • Tilføjet IndentExternBlock-mulighed til clang-formatværktøj til justering inden for eksterne "C" og eksterne "C++" blokke.
  • Den statiske analysator har forbedret håndtering af nedarvede konstruktører i C++. Tilføjet nye kontroller alpha.core.C11Lock og alpha.fuchsia.Lock for at tjekke for låse, alpha.security.cert.pos.34c for at detektere usikker brug af putenv, webkit.NoUncountedMemberChecker og webkit.RefCntblBaseVirtualDtor til at opdage problemer med alfa utallige typer .cplusplus .SmartPtr for at kontrollere for null smart pointer dereference.
  • I linter klirrende ryddeligt tilføjet en stor del af nye checks.
  • Clangd-cacheserveren (Clang Server) har forbedret ydeevne og tilføjet nye diagnostiske muligheder.

The main innovationer LLVM 11.0:

  • Byggesystemet er skiftet til at bruge Python 3. Hvis Python 3 ikke er tilgængeligt, er det muligt at rulle tilbage til at bruge Python 2.
  • Frontenden med compileren til Go-sproget (llgo) er udelukket fra udgivelsen, som kan blive omstruktureret i fremtiden.
  • Vector-function-abi-variant-attributten er blevet tilføjet til den mellemliggende repræsentation (IR) for at beskrive kortlægningen mellem skalar- og vektorfunktioner for at vektorisere opkald. Fra llvm::VectorType er der to separate vektortyper llvm::FixedVectorType og llvm::ScalableVectorType.
  • Forgrening baseret på udef-værdier og videregivelse af undef-værdier til standardbiblioteksfunktioner anerkendes som udefineret adfærd. I
    memset/memcpy/memmove tillader at sende undef-pointere, men hvis parameteren med størrelse er nul.

  • LLJIT har tilføjet understøttelse til at udføre statiske initialiseringer gennem metoderne LLJIT::initialize og LLJIT::deinitialize. Implementeret muligheden for at tilføje statiske biblioteker til JITDylib ved hjælp af klassen StaticLibraryDefinitionGenerator. Tilføjet C API til ORCv2 (API til opbygning af JIT-kompilere).
  • Understøttelse af Cortex-A64, Cortex-A34, Cortex-A77 og Cortex-X78-processorer er blevet tilføjet til backend for AArch1-arkitekturen. Implementeret ARMv8.2-BF16 (BFloat16) og ARMv8.6-A udvidelser, inklusive RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) og ARMv8.0-DGH (tip til dataindsamling). Muligheden for at generere kode til indbyggede funktionsbindinger til SVE-vektorinstruktioner er tilvejebragt.
  • Understøttelse af Cortex-M55, Cortex-A77, Cortex-A78 og Cortex-X1-processorer er blevet tilføjet til backend for ARM-arkitekturen. Udvidelser implementeret
    Armv8.6-A Matrix Multiply og RMv8.2-AA32BF16 BFloat16.

  • Understøttelse af kodegenerering til POWER10-processorer er blevet tilføjet til backend for PowerPC-arkitekturen. Loop-optimeringer er blevet udvidet, og floating point-understøttelse er blevet forbedret.
  • Backend til RISC-V-arkitekturen tillader accept af patches, der understøtter eksperimentelle udvidede instruktionssæt, der endnu ikke er blevet officielt godkendt.
  • Backend for AVR-arkitekturen er blevet overført fra den eksperimentelle kategori til stabil, inkluderet i basisfordelingen.
  • Backend til x86-arkitektur understøtter Intel AMX og TSXLDTRK instruktioner. Tilføjet beskyttelse mod angreb HVAC (Load Value Injection), og implementerer også en generel Speculative Execution Side Effect Suppression-mekanisme til at blokere angreb forårsaget af spekulativ udførelse af operationer på CPU'en.
  • I backend til SystemZ-arkitekturen er understøttelse af MemorySanitizer og LeakSanitizer blevet tilføjet.
  • Tilføjet understøttelse af header-fil med matematiske konstanter til Libc++ .
  • Udvidet LLD linker evner. Forbedret understøttelse af ELF-formatet, inklusive de tilføjede muligheder "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Tilføjet "--time-trace" mulighed for at gemme sporet til en fil, som derefter kan analyseres via chrome://tracing-grænsefladen i Chrome.

Kilde: opennet.ru

Tilføj en kommentar