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.
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.
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.