Lëshimi i paketës së përpiluesit LLVM 10.0

Pas gjashtë muajsh zhvillimi prezantuar publikimi i projektit LLVM 10.0 — Mjete të përputhshme me GCC (përpiluesit, optimizuesit dhe gjeneruesit e kodeve), përpilimi i programeve në bitkod të ndërmjetëm të instruksioneve virtuale të ngjashme me RISC (makinë virtuale e nivelit të ulët me një sistem optimizimi me shumë nivele). Pseudokodi i gjeneruar mund të konvertohet duke përdorur një përpilues JIT në udhëzime makine direkt në kohën e ekzekutimit të programit.

Veçoritë e reja në LLVM 10.0 përfshijnë mbështetje për konceptet C++, nuk ekzekuton më Clang si një proces më vete, mbështetje për kontrollet CFG (mbrojtëse të rrjedhës së kontrollit) për Windows dhe mbështetje për aftësitë e reja të CPU.

Përmirësimet në Clang 10.0:

  • Mbështetje e shtuar për "koncept", një shtesë e shabllonit C++ që do të përfshihet në standardin tjetër, me emrin e koduar C++2a (i aktivizuar nga flamuri -std=c++2a).
    Konceptet ju lejojnë të përcaktoni një grup kërkesash për parametrat shabllon që, në kohën e përpilimit, kufizojnë grupin e argumenteve që mund të pranohen si parametra shabllon. Konceptet mund të përdoren për të shmangur mospërputhjet logjike midis vetive të llojeve të të dhënave të përdorura brenda shabllonit dhe vetive të tipit të të dhënave të parametrave të hyrjes.

    shabllon
    koncepti Barazia e krahasueshme = kërkon(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Si parazgjedhje, nisja e një procesi të veçantë ("clang -cc1") në të cilin kryhet përpilimi ndalet. Përpilimi tani është bërë në procesin kryesor dhe opsioni "-fno-integrated-cc1" mund të përdoret për të rivendosur sjelljen e vjetër.
  • Mënyrat e reja të diagnostikimit:
    • "-Wc99-designator" dhe "-Wreorder-init-list" paralajmërojnë kundër përdorimit të inicializuesve C99 në modalitetin C++ në rastet kur ato janë të sakta në C99 por jo në C++20.
    • "-Wsizeof-array-div" - kap situata të tilla si "int arr[10]; …madhësia e (arr) / madhësia e (short)…” (duhet të jetë “madhësia e(arr) / madhësia e(int)”).
    • "-Wxor-used-as-po" - paralajmëron kundër përdorimit të konstrukteve të tilla si përdorimi i operatorit "^" (xor) në operacione që mund të ngatërrohen me fuqizimin (2^16).
    • "-Wfinal-dtor-non-final-class" - paralajmëron për klasat që nuk janë të shënuara me specifikuesin "final", por kanë një destruktor me atributin "përfundimtar".
    • "-Wtautological-bitwise-compare" është një grup paralajmërimesh për diagnostikimin e krahasimeve tautologjike midis një operacioni bit dhe një konstante, dhe për identifikimin e krahasimeve gjithmonë të vërteta në të cilat operacioni OR zbatohet në bit në një numër jo negativ.
    • "-Wbitwise-conditional-parenteses" paralajmëron probleme kur përzihen operatorët logjikë AND (&) dhe OR (|) me operatorin e kushtëzuar (?:).
    • "-Wmisleading-indentation" është një analog i çekut me të njëjtin emër nga GCC, i cili paralajmëron për shprehjet e dhëmbëzuara sikur të jenë pjesë e një blloku if/else/for/while, por në fakt nuk përfshihen në këtë bllok. .
    • Kur specifikoni "-Wextra", kontrolli "-Wdeprecated-copy" aktivizohet, duke paralajmëruar për përdorimin e konstruktorëve
      "lëviz" dhe "kopjo" në klasa me një përkufizim të qartë të destruktorit.

    • Kontrollet "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" janë zgjeruar.
    • Kontrollet "-Wbitwise-op-parentheses" dhe "-Wlogical-op-parentheses" janë çaktivizuar si parazgjedhje.
  • Në kodin C dhe C++, veprimet aritmetike të treguesve lejohen vetëm në vargje. Sanitizeri i sjelljes së papërcaktuar në modalitetin "-fsanitize=pointer-overflow" tani kap raste të tilla si shtimi i një zhvendosjeje jo-zero në një tregues null ose krijimi i një treguesi null kur zbritet një numër i plotë nga një tregues jo-nul.
  • Modaliteti "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) është përshtatur për të identifikuar problemet me operacionet e rritjes dhe zvogëlimit për llojet me një madhësi pak më të vogël se ajo e tipit "int".
  • Kur zgjidhni arkitekturat e synuara x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" dhe "-march=cooperlake" si parazgjedhje në vektorizim kodi ka ndaluar përdorimin e regjistrave zmm 512-bit, me përjashtim të treguesit të tyre të drejtpërdrejtë në kodin burimor. Arsyeja është se frekuenca e CPU-së zvogëlohet gjatë kryerjes së operacioneve 512-bit, gjë që mund të ndikojë negativisht në performancën e përgjithshme. Për të ndryshuar sjelljen e re, ofrohet opsioni "-mprefer-vector-width=512".
  • Sjellja e flamurit "-liri-vektor-konversionet" është e ngjashme me GCC: konvertimet implicite të biteve të vektorit midis vektorëve me numra të plotë dhe me pikë lundruese janë të ndaluara. Për të eliminuar këtë kufizim, propozohet përdorimi i flamurit
    "-flax-vector-conversions=all" që është parazgjedhja.

  • Mbështetje e përmirësuar për CPU-të MIPS të familjes Octeon. U shtua "octeon+" në listën e llojeve të vlefshme CPU.
  • Kur grumbullohet në kodin e ndërmjetëm WebAssembly, optimizuesi wasm-opt thirret automatikisht, nëse disponohet në sistem.
  • Për sistemet e bazuara në arkitekturën RISC-V, përdorimi i regjistrave që ruajnë vlerat e pikave lundruese lejohet në blloqet e kushtëzuara të inserteve në linjë të montimit.
  • U shtuan flamuj të rinj përpilues: "-fgnuc-version" për të vendosur vlerën e versionit për "__GNUC__" dhe makro të ngjashme; "-fmacro-prefix-map=OLD=NEW" për të zëvendësuar prefiksin e drejtorisë OLD me NEW në makro si "__FILE__"; "-fpatchable-function-entry=N[,M]" për të gjeneruar një numër të caktuar udhëzimesh NOP para dhe pas pikës hyrëse të funksionit. Për RISC-V
    shtoi mbështetje për flamujt "-fixed-xX", "-mcmodel=medany" dhe "-mcmodel=medlow".

  • U shtua mbështetje për atributin '__attribute__((target("branch-protection=..."))), efekti i të cilit është i ngjashëm me opsionin -mbrojtja e degëve.
  • Në platformën Windows, kur specifikoni flamurin "-cfguard", zbatohet zëvendësimi i kontrolleve të integritetit të rrjedhës së ekzekutimit (Control Flow Guard) për thirrjet indirekte të funksionit. Për të çaktivizuar zëvendësimin e çeqeve, mund të përdorni flamurin "-cfguard-nochecks" ose modifikuesin "__declspec(guard(nocf))".
  • Sjellja e atributit gnu_inline është e ngjashme me GCC në rastet kur përdoret pa fjalën kyçe "të jashtme".
  • Aftësitë që lidhen me mbështetjen e OpenCL dhe CUDA janë zgjeruar. Mbështetje e shtuar për veçoritë e reja OpenMP 5.0.
  • Një opsion standard është shtuar në mjetin e formatit clang, i cili ju lejon të përcaktoni versionin e standardit C++ të përdorur gjatë analizimit dhe formatimit të kodit (I fundit, Auto, c++03, c++11, c++14, c++17, c++20).
  • Kontrollet e reja janë shtuar në analizuesin statik: alpha.cplusplus.PlacementE re për të përcaktuar nëse ka hapësirë ​​të mjaftueshme ruajtëse, fuchsia.HandleChecker për të zbuluar rrjedhjet në lidhje me mbajtësit Fuchsia, security.insecureAPI.decodeValueOfObjCType për të zbuluar tejmbushjet e mundshme të tamponitOdebjCType kur përdorni [NSCoalueder :at:] .
  • Sanitizeri i sjelljes së papërcaktuar (UBSan) ka zgjeruar kontrollet e tij të tejmbushjes së treguesit për të kapur aplikimin e zhvendosjeve jo-zero në treguesit NULL ose shtimin që rezulton i një zhvendosjeje të treguesit NULL.
  • Në linter tingëllon-i rregullt shtuar një pjesë e madhe e çeqeve të reja.

Kryesore risitë LLVM 10.0:

  • Tek korniza Atributor Janë shtuar optimizime të reja ndërprocedurale dhe analizues. Parashikohet gjendja e 19 atributeve të ndryshme, duke përfshirë 12 atribute 12 LLVM IR dhe 7 atribute abstrakte si gjallëria.
  • U shtuan funksione të reja matematikore të matricës të integruara në përpilues (Intrinsics), të cilat zëvendësohen me instruksione vektoriale efikase gjatë përpilimit.
  • Përmirësime të shumta janë bërë në backend për arkitekturat X86, AArch64, ARM, SystemZ, MIPS, AMDGPU dhe PowerPC. Mbështetje e shtuar për CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 dhe Neoverse N1. Për ARMv8.1-M, ​​procesi i gjenerimit të kodit është optimizuar (për shembull, është shfaqur mbështetja për sythe me shpenzime minimale) dhe mbështetja për autovektorizim është shtuar duke përdorur shtrirjen MVE. Mbështetje e përmirësuar e CPU MIPS Octeon. Për PowerPC, aktivizohet vektorizimi i nënprogrameve matematikore duke përdorur bibliotekën MASSV (Mathematical Acceleration SubSystem), gjenerimi i kodit është përmirësuar dhe qasja në kujtesë nga unazat është optimizuar. Për x86, trajtimi i llojeve të vektorit v2i32, v4i16, v2i16, v8i8, v4i8 dhe v2i8 është ndryshuar.

  • Gjenerator i përmirësuar i kodit për WebAssembly. Mbështetje e shtuar për TLS (Thread-Local Storage) dhe udhëzimet atomic.fence. Mbështetja SIMD është zgjeruar ndjeshëm. Skedarët e objekteve WebAssembly tani kanë mundësinë të përdorin nënshkrime funksionesh me shumë vlera.
  • Analizatori përdoret gjatë përpunimit të sytheve MemorySSA, i cili ju lejon të përcaktoni varësitë midis operacioneve të ndryshme të memories. MemorySSA mund të reduktojë kohën e përpilimit dhe ekzekutimit ose mund të përdoret në vend të AliasSetTracker pa humbje të performancës.
  • Debugger LLDB ka përmirësuar ndjeshëm mbështetjen për formatin DWARF v5. Mbështetje e përmirësuar për ndërtimin me MinGW
    dhe shtoi aftësinë fillestare për të korrigjuar gabimet e ekzekutueshmeve të Windows për arkitekturat ARM dhe ARM64. Përshkrime të shtuara të opsioneve të ofruara gjatë plotësimit automatik të hyrjes duke shtypur skedën.

  • Zgjeruar Aftësitë lidhëse LLD. Mbështetje e përmirësuar për formatin ELF, duke përfshirë sigurimin e përputhshmërisë së plotë të shablloneve glob me lidhësin GNU, shtimin e mbështetjes për seksionet e kompresuara të korrigjimit ".zdebug", duke shtuar vetinë PT_GNU_PROPERTY për të përcaktuar seksionin .note.gnu.property (mund të përdoret në të ardhmen kernelet Linux),
    Janë zbatuar mënyrat "-z noseparate-code", "-z individual-code" dhe "-z individual-loadable-segments". Mbështetje e përmirësuar për MinGW dhe WebAssembly.

Burimi: opennet.ru

Shto një koment