Release av LLVM 10.0-kompilatorpaketet

Efter sex månaders utveckling presenteras projekt release LLVM 10.0 - GCC-kompatibla verktyg (kompilatorer, optimerare och kodgeneratorer) som kompilerar program till en mellanbitkod av RISC-liknande virtuella instruktioner (en virtuell dator på låg nivå med ett optimeringssystem på flera nivåer). Den genererade pseudokoden kan konverteras av JIT-kompilatorn till maskininstruktioner precis vid tidpunkten för programexekveringen.

Nya funktioner i LLVM 10.0 inkluderar stöd för C++-koncept, kör inte längre Clang som en separat process, stöd för CFG-kontroller (kontrollflödesvakt) för Windows och stöd för nya CPU-funktioner.

Förbättringar i Clang 10.0:

  • Lade till stöd för "begrepp", ett C++-malltillägg som kommer att inkluderas i nästa standard, kodnamnet C++2a (aktiveras av flaggan -std=c++2a).
    Begrepp låter dig definiera en uppsättning mallparameterkrav som vid kompilering begränsar uppsättningen argument som kan accepteras som mallparametrar. Koncepten kan användas för att undvika logiska inkonsekvenser mellan egenskaperna för datatyperna som används i mallen och datatypegenskaperna för indataparametrarna.

    mall
    koncept JämlikhetComparable = kräver(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Som standard stoppas lanseringen av en separat process ("clang -cc1") där kompilering utförs. Kompileringen görs nu i huvudprocessen, och alternativet "-fno-integrated-cc1" kan användas för att återställa det gamla beteendet.
  • Nya diagnostiska lägen:
    • "-Wc99-designator" och "-Wreorder-init-list" varnar för att använda C99-initierare i C++-läge i de fall de är korrekta i C99 men inte i C++20.
    • "-Wsizeof-array-div" - fångar situationer som "int arr[10]; …sizeof(arr) / sizeof(short)...” (ska vara “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - varnar för användningen av konstruktioner som användningen av operatorn "^" (xor) i operationer som kan förväxlas med exponentiering (2^16).
    • "-Wfinal-dtor-non-final-class" - varnar för klasser som inte är markerade med "final"-specifikationen, men som har en destruktor med attributet "final".
    • "-Wtautological-bitwise-compare" är en grupp varningar för att diagnostisera tautologiska jämförelser mellan en bitvis operation och en konstant, och för att identifiera alltid sanna jämförelser där den bitvisa ELLER-operationen tillämpas på ett icke-negativt tal.
    • "-Wbitwise-conditional-parentheses" varnar för problem när de logiska operatorerna AND (&) och OR (|) blandas med den villkorliga operatorn (?:).
    • "-Wmisleading-indentation" är en analog till checken med samma namn från GCC, som varnar för indragna uttryck som om de är en del av ett if/else/for/while-block, men i själva verket ingår de inte i detta block .
    • När du anger "-Wextra" är kontrollen "-Wdeprecated-copy" aktiverad, vilket varnar för användningen av konstruktorer
      "flytta" och "kopiera" i klasser med en explicit destruktordefinition.

    • Kontrollerna "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" har utökats.
    • Kontrollerna "-Wbitwise-op-parentheses" och "-Wlogical-op-parentheses" är inaktiverade som standard.
  • I C- och C++-kod är aritmetiska pekoperationer endast tillåtna i arrayer. Undefined Behavior Sanitizer i läget "-fsanitize=pointer-overflow" fångar nu fall som att lägga till en offset som inte är noll till en nollpekare eller skapa en nollpekare när man subtraherar ett heltal från en icke-nollpekare.
  • Läget "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) är anpassat för att identifiera problem med inkrement- och dekrementeringsoperationer för typer med en bitstorlek som är mindre än den för typen "int".
  • När du väljer x86 målarkitekturer "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" och "-march=cooperlake" som standard i vektoriserad The koden har slutat använda 512-bitars zmm-register, förutom deras direkta indikation i källkoden. Anledningen är att CPU-frekvensen minskar när man utför 512-bitars operationer, vilket kan påverka den totala prestandan negativt. För att ändra det nya beteendet finns alternativet "-mprefer-vector-width=512".
  • Beteendet för flaggan "-flax-vektor-omvandlingar" liknar GCC: implicita vektorbitomvandlingar mellan heltals- och flyttalsvektorer är förbjudna. För att eliminera denna begränsning föreslås att flaggan används
    "-flax-vector-conversions=all" som är standard.

  • Förbättrat stöd för MIPS-processorer i Octeon-familjen. Lade till "octeon+" till listan över giltiga CPU-typer.
  • Vid sammansättning till WebAssembly-mellankod anropas wasm-opt-optimeraren automatiskt, om den är tillgänglig i systemet.
  • För system baserade på RISC-V-arkitekturen är användningen av register som lagrar flyttalsvärden tillåten i villkorliga block av assembler-inline-inlägg.
  • Lade till nya kompilatorflaggor: "-fgnuc-version" för att ställa in versionsvärdet för "__GNUC__" och liknande makron; "-fmacro-prefix-map=OLD=NEW" för att ersätta katalogprefixet GAMMALT med NEW i makron som "__FILE__"; "-fpatchable-function-entry=N[,M]" för att generera ett visst antal NOP-instruktioner före och efter funktionsingångspunkten. För RISC-V
    lagt till stöd för flaggorna "-ffixed-xX", "-mcmodel=medany" och "-mcmodel=medlow".

  • Lade till stöd för attributet '__attribute__((target(“branch-protection=..."))), vars effekt liknar alternativet -branch-skydd.
  • På Windows-plattformen, när flaggan "-cfguard" specificeras, implementeras ersättning av exekveringsflödesintegritetskontroller (Control Flow Guard) för indirekta funktionsanrop. För att inaktivera checksubstitution kan du använda flaggan "-cfguard-nochecks" eller modifieraren "__declspec(guard(nocf))".
  • Beteendet för attributet gnu_inline liknar GCC i fall där det används utan nyckelordet "extern".
  • Möjligheterna förknippade med OpenCL- och CUDA-stöd har utökats. Tillagt stöd för nya OpenMP 5.0-funktioner.
  • Ett standardalternativ har lagts till i verktyget clang-format, vilket låter dig bestämma versionen av C++-standarden som används vid analys och formatering av kod (Senaste, Auto, c++03, c++11, c++14, c++17, c++20).
  • Nya kontroller har lagts till i den statiska analysatorn: alpha.cplusplus.PlacementNew för att avgöra om det finns tillräckligt med lagringsutrymme, fuchsia.HandleChecker för att upptäcka läckor relaterade till Fuchsia-hanterare, security.insecureAPI.decodeValueOfObjCType för att upptäcka potentiella buffertspill vid användning av [NSCoder decodeValueOfObjCTypeO :at:] .
  • Undefined Behavior Sanitizer (UBSan) har utökat sina pekarspillningskontroller för att fånga tillämpningen av icke-nollförskjutningar på NULL-pekare eller det resulterande tillägget av en NULL-pekaroffset.
  • I linter klang-prydligt Lagt till en stor del av nya kontroller.

Den huvudsakliga innovationer LLVM 10.0:

  • Till ramverket Tillskrivare Nya interproceduroptimeringar och analysatorer har lagts till. Tillståndet för 19 olika attribut förutsägs, inklusive 12 attribut 12 LLVM IR och 7 abstrakta attribut som livlighet.
  • Lade till nya matematiska matrisfunktioner inbyggda i kompilatorn (Inneboende), som ersätts av effektiva vektorinstruktioner under kompileringen.
  • Många förbättringar har gjorts av backends för X86, AArch64, ARM, SystemZ, MIPS, AMDGPU och PowerPC-arkitekturer. Lade till CPU-stöd
    Cortex-A65, Cortex-A65AE, Neoverse E1 och Neoverse N1. För ARMv8.1-M har kodgenereringsprocessen optimerats (till exempel har stöd för loopar med minimal overhead dykt upp) och stöd för autovektorisering har lagts till med MVE-tillägget. Förbättrat CPU MIPS Octeon-stöd. För PowerPC är vektorisering av matematiska subrutiner med MASSV-biblioteket (Mathematical Acceleration SubSystem) aktiverat, kodgenerering förbättras och minnesåtkomst från loopar optimeras. För x86 har hanteringen av vektortyperna v2i32, v4i16, v2i16, v8i8, v4i8 och v2i8 ändrats.

  • Förbättrad kodgenerator för WebAssembly. Tillagt stöd för TLS (Thread-Local Storage) och instruktioner för atomic.fence. SIMD-stödet har utökats avsevärt. WebAssembly-objektfiler har nu möjlighet att använda funktionssignaturer med flera värden.
  • Analysatorn används vid bearbetning av loopar MinneSSA, som låter dig definiera beroenden mellan olika minnesoperationer. MemorySSA kan minska kompilerings- och exekveringstiden eller kan användas istället för AliasSetTracker utan prestandaförlust.
  • LLDB-felsökaren har avsevärt förbättrat stödet för DWARF v5-formatet. Förbättrat stöd för att bygga med MinGW
    och lagt till initial förmåga att felsöka Windows körbara filer för ARM- och ARM64-arkitekturer. Lade till beskrivningar av alternativen som erbjuds vid autokomplettering av inmatning genom att trycka på tab.

  • Expanderat LLD länkfunktioner. Förbättrat stöd för ELF-formatet, inklusive full kompatibilitet av glob-mallar med GNU-länken, lagt till stöd för komprimerade felsökningssektioner ".zdebug", lade till egenskapen PT_GNU_PROPERTY för att definiera avsnittet .note.gnu.property (kan användas i framtida Linux kärnor),
    Lägena "-z noseparate-code", "-z separat-code" och "-z separate-loadable-segments" har implementerats. Förbättrat stöd för MinGW och WebAssembly.

Källa: opennet.ru

Lägg en kommentar