Utgivelse av LLVM 11.0-kompilatorpakken

Etter seks måneder med utvikling presentert prosjektutgivelse LLVM 11.0 — GCC-kompatible verktøy (kompilatorer, optimerere og kodegeneratorer), kompilering av programmer til mellombitkode for RISC-lignende virtuelle instruksjoner (virtuell maskin på lavt nivå med et optimaliseringssystem på flere nivåer). Den genererte pseudokoden kan konverteres ved hjelp av en JIT-kompilator til maskininstruksjoner direkte på tidspunktet for programkjøring.

Den viktigste endringen i den nye utgivelsen var inkluderingen av Flanke, grensesnitt for Fortran-språket. Flang støtter Fortran 2018, OpenMP 4.5 og OpenACC 3.0, men utviklingen av prosjektet er ennå ikke fullført og grensesnittet er begrenset til kodeparsing og kontroll av korrekthet. Generering av LLVM-mellomkode støttes ennå ikke, og for å generere kjørbare filer, genereres kanonisk kode og sendes til en ekstern Fortran-kompilator.

Forbedringer i Clang 11.0:

  • Lagt til muligheten til å gjenopprette det abstrakte syntakstreet (AST) for ødelagt C++-kode, som kan brukes til å diagnostisere feil og gir tilleggsinformasjon til eksterne verktøy som clang-tidy og clangd. Funksjonen er aktivert som standard for C++-kode og styres gjennom "-Xclang -f[no-]recovery-ast"-alternativene.
  • Lagt til nye diagnosemoduser:
    • "-Wpointer-to-int-cast" er en gruppe advarsler om casting av pekere til en int av heltallstype som ikke rommer alle mulige verdier.
    • "-Wuninitialized-const-reference" - advarsel om å sende uinitialiserte variabler i funksjonsparametere som aksepterer referanseargumenter med "const"-attributtet.
    • "-Wimplicit-const-int-float-conversion" - aktivert som standard advarsel om implisitt konvertering av en reell konstant til en heltallstype.
  • For ARM-plattformen leveres C-funksjoner innebygd i kompilatoren (Inneboende), erstattet av effektive vektorinstruksjoner Arm v8.1-M MVE og CDE. De tilgjengelige funksjonene er definert i overskriftsfilene arm_mve.h og arm_cde.h.
  • La til et sett med utvidede heltallstyper _ExtInt(N), som lar deg lage typer som ikke er multipler av potenser av to, som kan behandles effektivt på FPGA/HLS. For eksempel, _ExtInt(7) definerer en heltallstype som består av 7 biter.
  • Lagt til makroer som definerer støtte for innebygde C-funksjoner basert på ARM SVE (Scalable Vector Extension) instruksjoner:
    __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 er __ARM_FEATURE_SVE-makroen definert når AArch64-kode genereres ved å sette kommandolinjealternativet "-march=armv8-a+sve".

  • "-O"-flagget er nå identifisert med "-O1" optimaliseringsmodus i stedet for "-O2".
  • Lagt til nye kompilatorflagg:
    • "-fstack-clash-protection" - muliggjør beskyttelse mot skjæringspunktet mellom stabel og haug.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - lar deg velge unntakshåndteringsmodus for flyttall.
    • "-ffp-model={presis,strict,fast}" – Forenkler tilgangen til en rekke spesialiserte alternativer for flyttall.
    • "-fpch-codegen" og "-fpch-debuginfo" for å generere en forhåndskompilert header (PCH) med separate objektfiler for kode og debuginfo.
    • "-fsanitize-coverage-allowlist" og "-fsanitize-coverage-blocklist" for å sjekke dekningstesting av hvite og svarte lister.
    • "-mtls-size={12,24,32,48}" for å velge TLS-størrelsen (tråd-lokal lagring).
    • "-menable-experimental-extension" for å aktivere eksperimentelle RISC-V-utvidelser.
  • Standardmodusen for C er "-fno-common", som gir mer effektiv tilgang til globale variabler på enkelte plattformer.
  • Standard modulbuffer har blitt flyttet fra /tmp til ~/.cache-katalogen. For å overstyre kan du bruke "-fmodules-cache-path="-flagget.
  • Standard C-språkstandard har blitt oppdatert fra gnu11 til gnu17.
  • Lagt til foreløpig støtte for GNU C-utvidelse "asm inline» for å legge til assembler-innlegg. Utvidelsen blir fortsatt analysert, men behandles ikke på noen måte.
  • Mulighetene knyttet til OpenCL- og CUDA-støtte er utvidet. Lagt til støtte for OpenCL 2.0 blokkdiagnostikk og implementert nye OpenMP 5.0-funksjoner.
  • Lagt til IndentExternBlock-alternativet til clang-formatverktøy for justering innenfor eksterne "C" og eksterne "C++" blokker.
  • Den statiske analysatoren har forbedret håndtering av arvede konstruktører i C++. Lagt til nye sjekker alpha.core.C11Lock og alpha.fuchsia.Lock for å se etter låser, alpha.security.cert.pos.34c for å oppdage usikker bruk av putenv, webkit.NoUncountedMemberChecker og webkit.RefCntblBaseVirtualDtor for å oppdage problemer med alfa utallige typer .cplusplus .SmartPtr for å se etter null smart pointer dereference.
  • I linter klang-ryddig la til en stor del av nye sjekker.
  • Clangd-hurtigbufferserveren (Clang Server) har forbedret ytelse og lagt til nye diagnosefunksjoner.

Den viktigste innovasjoner LLVM 11.0:

  • Byggesystemet er byttet til å bruke Python 3. Hvis Python 3 ikke er tilgjengelig, er det mulig å rulle tilbake til å bruke Python 2.
  • Frontenden med kompilatoren for Go-språket (llgo) er ekskludert fra utgivelsen, som kan bli omstrukturert i fremtiden.
  • Vector-function-abi-variant-attributtet er lagt til den mellomliggende representasjonen (IR) for å beskrive tilordningen mellom skalar- og vektorfunksjoner for å vektorisere samtaler. Fra llvm::VectorType er det to separate vektortyper llvm::FixedVectorType og llvm::ScalableVectorType.
  • Forgrening basert på udef-verdier og overføring av undef-verdier til standard bibliotekfunksjoner er anerkjent som udefinert atferd. I
    memset/memcpy/memmove tillater å sende undef-pekere, men hvis parameteren med størrelse er null.

  • LLJIT har lagt til støtte for å utføre statiske initialiseringer gjennom metodene LLJIT::initialize og LLJIT::deinitialize. Implementerte muligheten til å legge til statiske biblioteker til JITDylib ved å bruke klassen StaticLibraryDefinitionGenerator. Lagt til C API for ORCv2 (API for å bygge JIT-kompilatorer).
  • Støtte for Cortex-A64, Cortex-A34, Cortex-A77 og Cortex-X78-prosessorer er lagt til bakenden for AArch1-arkitekturen. Implementert ARMv8.2-BF16 (BFloat16) og ARMv8.6-A utvidelser, inkludert RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) og ARMv8.0-DGH (datainnsamlingstips). Muligheten til å generere kode for innebygde funksjonsbindinger til SVE vektorinstruksjoner er gitt.
  • Støtte for Cortex-M55, Cortex-A77, Cortex-A78 og Cortex-X1-prosessorer er lagt til bakenden for ARM-arkitekturen. Utvidelser implementert
    Armv8.6-A Matrix Multiply og RMv8.2-AA32BF16 BFloat16.

  • Støtte for kodegenerering for POWER10-prosessorer er lagt til backend for PowerPC-arkitekturen. Sløyfeoptimaliseringer er utvidet og flytepunktstøtte er forbedret.
  • Bakenden for RISC-V-arkitekturen tillater aksept av patcher som støtter eksperimentelle utvidede instruksjonssett som ennå ikke er offisielt godkjent.
  • Backend for AVR-arkitekturen er overført fra eksperimentell kategori til stabil, inkludert i basisdistribusjonen.
  • Backend for x86-arkitektur støtter Intel AMX- og TSXLDTRK-instruksjoner. Lagt til beskyttelse mot angrep HVAC (Load Value Injection), og implementerer også en generell spekulativ utførelsessideeffektundertrykkelsesmekanisme for å blokkere angrep forårsaket av spekulativ utførelse av operasjoner på CPU.
  • I backend for SystemZ-arkitekturen er støtte for MemorySanitizer og LeakSanitizer lagt til.
  • Lagt til støtte for overskriftsfil med matematiske konstanter til Libc++ .
  • Utvidet LLD linker evner. Forbedret støtte for ELF-formatet, inkludert de ekstra alternativene "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Lagt til "--time-trace"-alternativet for å lagre sporet til en fil, som deretter kan analyseres via chrome://tracing-grensesnittet i Chrome.

Kilde: opennet.ru

Legg til en kommentar