Utgivelse av LLVM 10.0-kompilatorpakken

Etter seks måneder med utvikling presentert prosjektutgivelse LLVM 10.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.

Nye funksjoner i LLVM 10.0 inkluderer støtte for C++ Concepts, kjører ikke lenger Clang som en egen prosess, støtte for CFG (control flow guard) sjekker for Windows, og støtte for nye CPU-funksjoner.

Forbedringer i Clang 10.0:

  • Lagt til støtte for "konseptet", en C++ malutvidelse som vil bli inkludert i den neste standarden, kodenavnet C++2a (slått på av -std=c++2a-flagget).
    Konsepter lar deg definere et sett med malparameterkrav som på kompileringstidspunktet begrenser settet med argumenter som kan aksepteres som malparametere. Konseptene kan brukes for å unngå logiske inkonsekvenser mellom egenskapene til datatypene som brukes i malen og datatypeegenskapene til inngangsparameterne.

    mal
    konsept LikhetSammenlignbar = krever(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Som standard stoppes lanseringen av en egen prosess ("clang -cc1") der kompilering utføres. Kompilering gjøres nå i hovedprosessen, og alternativet "-fno-integrated-cc1" kan brukes til å gjenopprette den gamle virkemåten.
  • Nye diagnosemoduser:
    • "-Wc99-designator" og "-Wreorder-init-list" advarer mot å bruke C99-initialisatorer i C++-modus i tilfeller der de er riktige i C99, men ikke i C++20.
    • "-Wsizeof-array-div" - fanger opp situasjoner som "int arr[10]; …sizeof(arr) / sizeof(short)...” (skal være “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - advarer mot bruk av konstruksjoner som bruk av "^" (xor)-operatoren i operasjoner som kan forveksles med eksponentiering (2^16).
    • "-Wfinal-dtor-non-final-class" - advarer om klasser som ikke er merket med "final"-spesifikasjonen, men som har en destruktor med "final"-attributtet.
    • "-Wtautological-bitwise-compare" er en gruppe advarsler for å diagnostisere tautologiske sammenligninger mellom en bitvis operasjon og en konstant, og for å identifisere alltid sanne sammenligninger der den bitvise OR-operasjonen brukes på et ikke-negativt tall.
    • "-Wbitwise-conditional-parentheses" advarer om problemer når du blander de logiske operatorene AND (&) og OR (|) med den betingede operatoren (?:).
    • "-Wmisleading-indentation" er en analog av sjekken med samme navn fra GCC, som advarer om innrykkede uttrykk som om de er en del av en if/else/for/while-blokk, men de er faktisk ikke inkludert i denne blokken .
    • Når du spesifiserer "-Wextra", er kontrollen "-Wdeprecated-copy" aktivert, og advarer om bruk av konstruktører
      "flytte" og "kopier" i klasser med en eksplisitt destruktordefinisjon.

    • Kontrollene "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" er utvidet.
    • Kontrollene "-Wbitwise-op-parentheses" og "-Wlogical-op-parentheses" er deaktivert som standard.
  • I C- og C++-kode er pekeraritmetiske operasjoner bare tillatt i matriser. Undefined Behavior Sanitizer i "-fsanitize=pointer-overflow"-modus fanger nå tilfeller som å legge til en ikke-null-forskyvning til en null-peker eller opprette en null-peker når du trekker et heltall fra en ikke-null-peker.
  • Modusen "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) er tilpasset for å identifisere problemer med inkrement- og dekrementeringsoperasjoner for typer med en bitstørrelse som er mindre enn den for "int"-typen.
  • Når du velger x86-målarkitekturer "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" og "-march=cooperlake" som standard i vektorisert The koden har sluttet å bruke 512-bits zmm-registre, bortsett fra deres direkte indikasjon i kildekoden. Årsaken er at CPU-frekvensen reduseres når du utfører 512-bits operasjoner, noe som kan påvirke den generelle ytelsen negativt. For å endre den nye virkemåten, er alternativet "-mprefer-vector-width=512" gitt.
  • Oppførselen til "-flax-vector-conversions"-flagget ligner på GCC: implisitte vektorbitkonverteringer mellom heltalls- og flyttallsvektorer er forbudt. For å eliminere denne begrensningen foreslås det å bruke flagget
    "-flax-vector-conversions=all" som er standard.

  • Forbedret støtte for MIPS CPUer fra Octeon-familien. La "octeon+" til listen over gyldige CPU-typer.
  • Ved montering i WebAssembly-mellomkode kalles wasm-opt-optimalisatoren automatisk, hvis den er tilgjengelig i systemet.
  • For systemer basert på RISC-V-arkitekturen er bruk av registre som lagrer flyttallsverdier tillatt i betingede blokker av assembler-innlegg.
  • Lagt til nye kompilatorflagg: "-fgnuc-version" for å angi versjonsverdien for "__GNUC__" og lignende makroer; "-fmacro-prefix-map=GAMMEL=NYHET" for å erstatte katalogprefikset GAMMEL med NYTT i makroer som "__FILE__"; "-fpatchable-function-entry=N[,M]" for å generere et visst antall NOP-instruksjoner før og etter funksjonsinngangspunktet. For RISC-V
    lagt til støtte for flaggene "-ffixed-xX", "-mcmodel=medany" og "-mcmodel=medlow".

  • Lagt til støtte for '__attribute__((target("branch-protection=...")))-attributtet, hvis effekt ligner på alternativet -branch-beskyttelse.
  • På Windows-plattformen, når du spesifiserer "-cfguard"-flagget, implementeres substitusjon av utførelsesflytintegritetskontroller (Control Flow Guard) for indirekte funksjonskall. For å deaktivere sjekkebytte, kan du bruke "-cfguard-nochecks"-flagget eller "__declspec(guard(nocf))"-modifikatoren.
  • Atferden til gnu_inline-attributtet ligner på GCC i tilfeller der det brukes uten nøkkelordet "extern".
  • Mulighetene knyttet til OpenCL- og CUDA-støtte er utvidet. Lagt til støtte for nye OpenMP 5.0-funksjoner.
  • Et standardalternativ er lagt til clang-format-verktøyet, som lar deg bestemme versjonen av C++-standarden som brukes ved parsing og formatering av kode (Latest, Auto, c++03, c++11, c++14, c++17, c++20).
  • Nye kontroller er lagt til den statiske analysatoren: alpha.cplusplus.PlacementNew for å avgjøre om det er tilstrekkelig lagringsplass, fuchsia.HandleChecker for å oppdage lekkasjer relatert til Fuchsia-behandlere, security.insecureAPI.decodeValueOfObjCType for å oppdage potensielle bufferoverløp ved bruk av [NSCoder decodeValueOfObjCTypeO :at:] .
  • Undefined Behavior Sanitizer (UBSan) har utvidet sine pekeroverflyt-kontroller for å fange opp bruken av ikke-null-forskyvninger til NULL-pekere eller det resulterende tillegget av en NULL-pekeroffset.
  • I linter klang-ryddig la til en stor del av nye sjekker.

Den viktigste innovasjoner LLVM 10.0:

  • Til rammeverket Attributor Nye interprosedyreoptimaliseringer og analysatorer er lagt til. Tilstanden til 19 forskjellige attributter er spådd, inkludert 12 attributter 12 LLVM IR og 7 abstrakte attributter som livlighet.
  • Lagt til nye matematiske matrisefunksjoner innebygd i kompilatoren (Inneboende), som erstattes av effektive vektorinstruksjoner under kompilering.
  • Tallrike forbedringer har blitt gjort på backends for X86, AArch64, ARM, SystemZ, MIPS, AMDGPU og PowerPC-arkitekturer. Lagt til CPU-støtte
    Cortex-A65, Cortex-A65AE, Neoverse E1 og Neoverse N1. For ARMv8.1-M er kodegenereringsprosessen optimalisert (for eksempel har støtte for løkker med minimal overhead dukket opp) og støtte for autovektorisering er lagt til ved å bruke MVE-utvidelsen. Forbedret CPU MIPS Octeon-støtte. For PowerPC er vektorisering av matematiske subrutiner ved å bruke MASSV (Mathematical Acceleration SubSystem)-biblioteket aktivert, kodegenerering forbedres og minnetilgang fra looper er optimalisert. For x86 er håndteringen av vektortypene v2i32, v4i16, v2i16, v8i8, v4i8 og v2i8 endret.

  • Forbedret kodegenerator for WebAssembly. Lagt til støtte for TLS (Thread-Local Storage) og atomic.fence-instruksjoner. SIMD-støtte er betydelig utvidet. WebAssembly-objektfiler har nå muligheten til å bruke funksjonssignaturer med flere verdier.
  • Analysatoren brukes ved behandling av looper MinneSSA, som lar deg definere avhengigheter mellom forskjellige minneoperasjoner. MemorySSA kan redusere kompilerings- og utførelsestiden eller kan brukes i stedet for AliasSetTracker uten tap av ytelse.
  • LLDB-feilsøkeren har betydelig forbedret støtte for DWARF v5-formatet. Forbedret støtte for bygging med MinGW
    og lagt til den første muligheten til å feilsøke Windows-kjørbare filer for ARM- og ARM64-arkitekturer. Lagt til beskrivelser av alternativene som tilbys ved autofullføring av inndata ved å trykke på tab.

  • Utvidet LLD linker evner. Forbedret støtte for ELF-formatet, inkludert å sikre full kompatibilitet av glob-maler med GNU-linkeren, legge til støtte for komprimerte feilsøkingsseksjoner ".zdebug", legge til PT_GNU_PROPERTY-egenskapen for å definere .note.gnu.property-delen (kan brukes i fremtiden Linux-kjerner),
    Modusene "-z noseparate-code", "-z separate-code" og "-z separate-loadable-segments" er implementert. Forbedret støtte for MinGW og WebAssembly.

Kilde: opennet.ru

Legg til en kommentar