Release fan de LLVM 10.0-kompilersuite

Nei seis moannen fan ûntwikkeling presintearre projekt release LLVM 10.0 - GCC-kompatibele ark (kompilators, optimizers en koadegenerators), kompilearjen fan programma's yn intermediate bitcode fan RISC-lykas firtuele ynstruksjes (leech-level firtuele masine mei in multi-level optimisaasjesysteem). De oanmakke pseudokoade kin wurde omboud mei in JIT-kompiler yn masineynstruksjes direkt op it momint fan útfiering fan it programma.

Nije funksjes yn LLVM 10.0 omfetsje stipe foar C ++ Concepts, rint net mear Clang as in apart proses, stipe foar CFG (control flow guard) kontrôles foar Windows, en stipe foar nije CPU-mooglikheden.

Ferbetterings yn Clang 10.0:

  • Stipe tafoege foar "konsepten", in C ++ sjabloan tafoeging dy't sil wurde opnaam yn de folgjende standert, koadenamme C ++ 2a (ynskeakele troch de -std = c ++ 2a flagge).
    Konsepten kinne jo definiearje in set fan sjabloan parameter easken dy't, op gearstalling tiid, beheine de set fan arguminten dy't kin wurde akseptearre as sjabloan parameters. De begripen kinne brûkt wurde om logyske ynkonsistinsjes te foarkommen tusken de eigenskippen fan 'e gegevenstypen dy't brûkt wurde binnen it sjabloan en de gegevenstype-eigenskippen fan' e ynfierparameters.

    sjabloan
    concept EqualityComparable = fereasket(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Standert wurdt de lansearring fan in apart proses ("clang -cc1") wêryn kompilaasje útfierd wurdt stoppe. Kompilaasje wurdt no dien yn it haadproses, en de opsje "-fno-integrated-cc1" kin brûkt wurde om it âlde gedrach te herstellen.
  • Nije diagnostyske modi:
    • "-Wc99-designator" en "-Wreorder-init-list" warskôgje foar it brûken fan C99-initialisators yn C++-modus yn gefallen dêr't se korrekt binne yn C99, mar net yn C++20.
    • "-Wsizeof-array-div" - vangt situaasjes op lykas "int arr[10]; ...sizeof(arr) / sizeof(koart)..." (moat "sizeof(arr) / sizeof(int) wêze").
    • "-Wxor-used-as-po" - warskôget foar it brûken fan konstruksjes lykas it brûken fan de operator "^" (xor) yn operaasjes dy't betize wurde kinne mei eksponentiaasje (2^16).
    • "-Wfinal-dtor-non-final-class" - warskôget oer klassen dy't net markearre binne mei de "finale" specifier, mar hawwe in destructor mei de "final" attribút.
    • "-Wtautologysk-bitwiis-fergelykje" is in groep warskôgings foar it diagnostisearjen fan tautologyske fergelikingen tusken in bitwize operaasje en in konstante, en foar it identifisearjen fan altyd wiere fergelikingen wêrby't de bitwize OR-operaasje tapast wurdt op in net-negatyf getal.
    • "-Wbitwise-conditional-parentheses" warskôget foar problemen by it mingjen fan de logyske operators AND (&) en OR (|) mei de conditional operator (?:).
    • "-Wmisleading-indentation" is in analoog fan 'e sjek mei deselde namme fan GCC, dy't warskôget foar ynspringende útdrukkingen as oft se diel útmeitsje fan in if/else/for/while-blok, mar feitlik binne se net opnommen yn dit blok .
    • As jo ​​"-Wextra" oantsjutte, is de kontrôle "-Wdeprecated-copy" ynskeakele, warskôging oer it gebrûk fan konstruktors
      "ferpleatse" en "kopiearje" yn klassen mei in eksplisite destruktordefinysje.

    • De kontrôles "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" binne útwreide.
    • De kontrôles "-Wbitwise-op-parentheses" en "-Wlogical-op-parentheses" binne standert útskeakele.
  • Yn C en C ++ koade, oanwizer arithmetic operaasjes binne allinnich tastien yn arrays. De Undefined Behavior Sanitizer yn "-fsanitize = pointer-overflow" modus fangt no gefallen op lykas it tafoegjen fan in non-nul offset oan in nul pointer of it meitsjen fan in nul pointer by it subtrahearjen fan in hiel getal fan in net nul pointer.
  • De modus "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) is oanpast om problemen te identifisearjen mei inkrement- en ferminderingsoperaasjes foar typen mei in bitgrutte lytser as dy fan it type "int".
  • By it selektearjen fan x86-doelarsjitektueren "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" en "-march=cooperlake" standert yn vectorisearre De koade is stoppe mei it brûken fan 512-bit zmm registers, útsein foar harren direkte oantsjutting yn de boarne koade. De reden is dat de CPU frekwinsje nimt ôf by it útfieren fan 512-bit operaasjes, dat kin negatyf beynfloedzje de totale prestaasjes. Om it nije gedrach te feroarjen, wurdt de opsje "-mrefer-vector-width=512" foarsjoen.
  • It gedrach fan 'e flagge "-flax-vector-conversions" is fergelykber mei GCC: ymplisite fektorbitkonverzjes tusken integer- en driuwende-puntfektors binne ferbean. Om dizze beheining te eliminearjen, wurdt foarsteld om de flagge te brûken
    "-flax-vector-conversions=alles" dat is de standert.

  • Ferbettere stipe foar MIPS CPU's fan 'e Octeon-famylje. "octeon+" tafoege oan de list mei jildige CPU-typen.
  • By it gearstallen yn WebAssembly tuskenkoade, wurdt de wasm-opt-optimizer automatysk oanroppen, as beskikber yn it systeem.
  • Foar systemen basearre op 'e RISC-V-arsjitektuer is it gebrûk fan registers dy't driuwende puntwearden opslaan tastien yn betingste blokken fan assembler ynline-ynserts.
  • Nije kompilerflaggen tafoege: "-fgnuc-version" om de ferzjewearde yn te stellen foar "__GNUC__" en ferlykbere makro's; "-fmacro-prefix-map=OUD=NIJ" om it mapfoarheaksel OUD te ferfangen troch NIJ yn makro's lykas "__FILE__"; "-fpatchable-function-entry=N[,M]" om in bepaald oantal NOP-ynstruksjes foar en nei it funksje-yngongspunt te generearjen. Foar RISC-V
    stipe tafoege foar de flaggen "-ffixed-xX", "-mcmodel=medany" en "-mcmodel=medlow".

  • Stipe tafoege foar it '__attribute__((target ("branch-protection=..."))) attribút, wêrfan it effekt fergelykber is mei de opsje -branch-beskerming.
  • Op it Windows-platfoarm, as jo de flagge "-cfguard" spesifisearje, wurdt ferfanging fan kontrôles fan útfieringsstreamyntegriteit (Control Flow Guard) foar yndirekte funksjeoproppen ymplementearre. Om kontrôleferfanging út te skeakeljen, kinne jo de flagge "-cfguard-nochecks" of de "__declspec(guard(nocf))"-modifier brûke.
  • It gedrach fan it gnu_inline-attribút is gelyk oan GCC yn gefallen dêr't it wurdt brûkt sûnder it "eksterne" kaaiwurd.
  • De mooglikheden ferbûn mei OpenCL en CUDA-stipe binne útwreide. Stipe tafoege foar nije OpenMP 5.0-funksjes.
  • In standertopsje is tafoege oan it clang-formaat helpprogramma, wêrmei jo de ferzje fan 'e C++ standert kinne bepale dy't brûkt wurdt by it parsearjen en opmaak fan koade (Latest, Auto, c++03, c++11, c++14, c++17, c++20).
  • Nije kontrôles binne tafoege oan de statyske analysator: alpha.cplusplus.PlacementNew om te bepalen oft der genôch opslachromte is, fuchsia.HandleChecker om lekken te detektearjen dy't relatearre binne oan Fuchsia-hannelers, security.insecureAPI.decodeValueOfObjCType om potinsjele bufferoerstreamingen te detektearjen by it brûken fan [NSCoder decodeValueOfObjCTypueOf :by:] .
  • De Undefined Behavior Sanitizer (UBSan) hat syn oanwizer oerstreamkontrôles útwreide om de tapassing fan net-nul offsets te fangen op NULL pointers of de resultearjende tafoeging fan in NULL pointer offset.
  • Yn linter clang-tidy tafoege in grut part fan nije sjeks.

haad ynnovaasjes LLVM 10.0:

  • Oan it ramt Attributor Nije ynterproseduere optimalisaasjes en analysators binne tafoege. De steat fan 19 ferskillende attributen wurdt foarsein, ynklusyf 12 attributen 12 LLVM IR en 7 abstrakte attributen lykas liveness.
  • Nije matriks wiskundige funksjes tafoege yn 'e kompilator (Intrinsics), dy't wurde ferfongen troch effisjinte fektorynstruksjes by kompilaasje.
  • Tal fan ferbetteringen binne makke oan backends foar X86, AArch64, ARM, SystemZ, MIPS, AMDGPU en PowerPC-arsjitektuer. Added CPU-stipe
    Cortex-A65, Cortex-A65AE, Neoverse E1 en Neoverse N1. Foar ARMv8.1-M is it proses foar generaasje fan koade optimalisearre (bygelyks is stipe foar loops mei minimale overhead ferskynd) en stipe foar autovectorisaasje is tafoege mei de MVE-útwreiding. Ferbettere CPU MIPS Octeon-stipe. Foar PowerPC is vectorization fan wiskundige subroutines mei help fan de MASSV (Mathematical Acceleration SubSystem) biblioteek ynskeakele, koade generaasje wurdt ferbettere, en ûnthâld tagong út loops wurdt optimalisearre. Foar x86 is de ôfhanneling fan fektortypen v2i32, v4i16, v2i16, v8i8, v4i8 en v2i8 feroare.

  • Ferbettere koadegenerator foar WebAssembly. Stipe tafoege foar TLS (Thread-Local Storage) en atomic.fence ynstruksjes. SIMD-stipe is signifikant útwreide. WebAssembly-objektbestannen hawwe no de mooglikheid om multi-weardige funksje-hantekeningen te brûken.
  • De analysator wurdt brûkt by it ferwurkjen fan loops MemorySSA, wêrtroch jo ôfhinklikens kinne definiearje tusken ferskate ûnthâldoperaasjes. MemorySSA kin kompilaasje en útfiering tiid ferminderje of kin brûkt wurde ynstee fan AliasSetTracker sûnder ferlies fan prestaasjes.
  • De LLDB-debugger hat de stipe foar it DWARF v5-formaat signifikant ferbettere. Ferbettere stipe foar bouwen mei MinGW
    en tafoege inisjele mooglikheid om Windows-útfierbere bestannen te debuggen foar ARM- en ARM64-arsjitektuer. Tafoege beskriuwingen fan de opsjes oanbean by it automatysk ynfoljen fan ynfier troch te drukken op ljepper.

  • Utwreide LLD linker mooglikheden. Ferbettere stipe foar it ELF-formaat, ynklusyf it garandearjen fan folsleine kompatibiliteit fan glob-sjabloanen mei de GNU-linker, it tafoegjen fan stipe foar komprimearre debugseksjes ".zdebug", it tafoegjen fan it PT_GNU_PROPERTY-eigenskip om de .note.gnu.property-seksje te definiearjen (kin yn 'e takomst brûkt wurde Linux kernels),
    De modi "-z noseparate-code", "-z separate-code" en "-z separate-loadable-segments" binne ymplementearre. Ferbettere stipe foar MinGW en WebAssembly.

Boarne: opennet.ru

Add a comment