Udgivelse af LLVM 10.0 compiler suite

Efter seks måneders udvikling præsenteret projektudgivelse LLVM 10.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.

Nye funktioner i LLVM 10.0 inkluderer understøttelse af C++-koncepter, kører ikke længere Clang som en separat proces, understøttelse af CFG-tjek (control flow guard) til Windows og understøttelse af nye CPU-funktioner.

Forbedringer i Clang 10.0:

  • Tilføjet support til "konceptet", en C++ skabelonudvidelse, der vil blive inkluderet i den næste standard, kodenavnet C++2a (slået til af -std=c++2a flaget).
    Koncepter giver dig mulighed for at definere et sæt skabelonparameterkrav, der på kompileringstidspunktet begrænser det sæt af argumenter, der kan accepteres som skabelonparametre. Koncepterne kan bruges til at undgå logiske uoverensstemmelser mellem egenskaberne for de datatyper, der anvendes i skabelonen, og datatypeegenskaberne for inputparametrene.

    skabelon
    koncept LighedSammenlignelig = kræver(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Som standard stoppes lanceringen af ​​en separat proces ("clang -cc1"), hvor kompilering udføres. Kompilering er nu udført i hovedprocessen, og "-fno-integrated-cc1" muligheden kan bruges til at gendanne den gamle adfærd.
  • Nye diagnostiske tilstande:
    • "-Wc99-designator" og "-Wreorder-init-list" advarer mod at bruge C99 initializers i C++ tilstand i tilfælde, hvor de er korrekte i C99, men ikke i C++20.
    • "-Wsizeof-array-div" - fanger situationer såsom "int arr[10]; …sizeof(arr) / sizeof(short)...” (skal være “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - advarer mod brugen af ​​konstruktioner såsom brugen af ​​"^" (xor) operatoren i operationer, der kan forveksles med eksponentiering (2^16).
    • "-Wfinal-dtor-non-final-class" - advarer om klasser, der ikke er markeret med "final"-specifikationen, men som har en destructor med "final"-attributten.
    • "-Wtautological-bitwise-compare" er en gruppe advarsler til diagnosticering af tautologiske sammenligninger mellem en bitwise operation og en konstant, og til at identificere altid sande sammenligninger, hvor den bitwise OR operation anvendes på et ikke-negativt tal.
    • "-Wbitwise-conditional-parentheses" advarer om problemer, når de logiske operatorer AND (&) og OR (|) blandes med den betingede operator (?:).
    • "-Wmisleading-indentation" er en analog af checken af ​​samme navn fra GCC, som advarer om indrykkede udtryk, som om de er en del af en if/else/for/while-blok, men faktisk er de ikke inkluderet i denne blok .
    • Når du angiver "-Wextra", er kontrollen "-Wdeprecated-copy" aktiveret, hvilket advarer om brugen af ​​konstruktører
      "move" og "copy" i klasser med en eksplicit destructor definition.

    • Kontrollerne "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" er blevet udvidet.
    • Kontrollerne "-Wbitwise-op-parentheses" og "-Wlogical-op-parentheses" er deaktiveret som standard.
  • I C- og C++-kode er pointer-aritmetiske operationer kun tilladt i arrays. Undefined Behavior Sanitizer i "-fsanitize=pointer-overflow"-tilstand fanger nu tilfælde som f.eks. tilføjelse af en ikke-nul forskydning til en nul-markør eller oprettelse af en nul-markør, når man trækker et heltal fra en ikke-nul-markør.
  • "-fsanitize=implicit-conversion"-tilstanden (Implicit Conversion Sanitizer) er tilpasset til at identificere problemer med inkrementering og dekrementering for typer med en bitstørrelse, der er mindre end "int"-typen.
  • Når du vælger x86-målarkitekturer "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" og "-march=cooperlake" som standard i vektoriseret The kode er holdt op med at bruge 512-bit zmm registre, bortset fra deres direkte indikation i kildekoden. Årsagen er, at CPU-frekvensen falder, når der udføres 512-bit operationer, hvilket kan påvirke den generelle ydeevne negativt. For at ændre den nye adfærd er muligheden "-mprefer-vector-width=512" tilvejebragt.
  • Opførselen af ​​flaget "-flax-vector-conversions" ligner GCC: implicitte vektorbitkonverteringer mellem heltal- og flydende kommavektorer er forbudt. For at fjerne denne begrænsning foreslås det at bruge flaget
    "-flax-vector-conversions=all", som er standard.

  • Forbedret understøttelse af MIPS CPU'er fra Octeon-familien. Tilføjet "octeon+" til listen over gyldige CPU-typer.
  • Ved samling i WebAssembly mellemkode kaldes wasm-opt optimizer automatisk, hvis den er tilgængelig i systemet.
  • For systemer baseret på RISC-V-arkitekturen er brugen af ​​registre, der lagrer flydende kommaværdier, tilladt i betingede blokke af assembler-inline-indsatser.
  • Tilføjet nye compilerflag: "-fgnuc-version" for at indstille versionsværdien for "__GNUC__" og lignende makroer; "-fmacro-prefix-map=GAMMEL=NY" for at erstatte mappepræfikset GAMLE med NY i makroer såsom "__FILE__"; "-fpatchable-function-entry=N[,M]" for at generere et bestemt antal NOP-instruktioner før og efter funktionsindgangspunktet. Til RISC-V
    tilføjet understøttelse af flagene "-ffixed-xX", "-mcmodel=medany" og "-mcmodel=medlow".

  • Tilføjet understøttelse af '__attribute__((target(“branch-protection=..."))) attributten, hvis effekt ligner muligheden -gren-beskyttelse.
  • På Windows-platformen, når "-cfguard"-flaget angives, implementeres substitution af udførelsesflowintegritetstjek (Control Flow Guard) for indirekte funktionskald. For at deaktivere check substitution kan du bruge "-cfguard-nochecks" flaget eller "__declspec(guard(nocf))" modifikatoren.
  • Opførselen af ​​attributten gnu_inline ligner GCC i tilfælde, hvor den bruges uden nøgleordet "ekstern".
  • Mulighederne forbundet med OpenCL og CUDA support er blevet udvidet. Tilføjet understøttelse af nye OpenMP 5.0-funktioner.
  • En standardindstilling er blevet tilføjet til clang-format-værktøjet, som giver dig mulighed for at bestemme versionen af ​​C++-standarden, der bruges ved parsing og formatering af kode (Seneste, Auto, c++03, c++11, c++14, c++17, c++20).
  • Nye kontroller er blevet tilføjet til den statiske analysator: alpha.cplusplus.PlacementNew for at bestemme, om der er tilstrækkelig lagerplads, fuchsia.HandleChecker til at detektere lækager relateret til Fuchsia-handlere, security.insecureAPI.decodeValueOfObjCType for at detektere potentielle bufferoverløb ved brug af [NSCoder decodeValueOfObjCTypeO :at:] .
  • Undefined Behavior Sanitizer (UBSan) har udvidet sin pointeroverløbskontrol for at fange anvendelsen af ​​ikke-nul offsets til NULL pointere eller den resulterende tilføjelse af en NULL pointer offset.
  • I linter klirrende ryddeligt tilføjet en stor del af nye checks.

The main innovationer LLVM 10.0:

  • Til rammerne Attributor Nye interprocedureelle optimeringer og analysatorer er blevet tilføjet. Tilstanden af ​​19 forskellige attributter er forudsagt, herunder 12 attributter 12 LLVM IR og 7 abstrakte attributter såsom livlighed.
  • Tilføjet nye matematiske matrixfunktioner indbygget i compileren (Iboende), som erstattes af effektive vektorinstruktioner under kompilering.
  • Der er lavet adskillige forbedringer til backends til X86, AArch64, ARM, SystemZ, MIPS, AMDGPU og PowerPC-arkitekturer. Tilføjet CPU-understøttelse
    Cortex-A65, Cortex-A65AE, Neoverse E1 og Neoverse N1. For ARMv8.1-M er kodegenereringsprocessen blevet optimeret (for eksempel er understøttelse af sløjfer med minimal overhead dukket op), og understøttelse af autovektorisering er blevet tilføjet ved hjælp af MVE-udvidelsen. Forbedret CPU MIPS Octeon-understøttelse. For PowerPC er vektorisering af matematiske underrutiner ved hjælp af MASSV (Mathematical Acceleration SubSystem) biblioteket aktiveret, kodegenerering forbedres, og hukommelsesadgang fra loops er optimeret. For x86 er håndteringen af ​​vektortyperne v2i32, v4i16, v2i16, v8i8, v4i8 og v2i8 blevet ændret.

  • Forbedret kodegenerator til WebAssembly. Tilføjet understøttelse af TLS (Thread-Local Storage) og atomic.fence instruktioner. SIMD-support er blevet betydeligt udvidet. WebAssembly-objektfiler har nu muligheden for at bruge funktionssignaturer med flere værdier.
  • Analysatoren bruges ved behandling af sløjfer HukommelseSSA, som giver dig mulighed for at definere afhængigheder mellem forskellige hukommelsesoperationer. MemorySSA kan reducere kompilerings- og eksekveringstiden eller kan bruges i stedet for AliasSetTracker uden tab af ydeevne.
  • LLDB-debuggeren har væsentligt forbedret understøttelse af DWARF v5-formatet. Forbedret support til bygning med MinGW
    og tilføjet indledende mulighed for at fejlsøge Windows-eksekverbare filer til ARM- og ARM64-arkitekturer. Tilføjet beskrivelser af de muligheder, der tilbydes ved autofuldførelse af input ved at trykke på tab.

  • Udvidet LLD linker evner. Forbedret understøttelse af ELF-formatet, herunder sikring af fuld kompatibilitet af glob-skabeloner med GNU-linkeren, tilføjelse af understøttelse af komprimerede debugsektioner ".zdebug", tilføjelse af egenskaben PT_GNU_PROPERTY for at definere .note.gnu.property-sektionen (kan bruges i fremtiden Linux-kerner),
    Modierne "-z noseparate-code", "-z separate-code" og "-z separate-loadable-segments" er blevet implementeret. Forbedret understøttelse af MinGW og WebAssembly.

Kilde: opennet.ru

Tilføj en kommentar