Pagpagawas sa LLVM 10.0 compiler set

Human sa unom ka bulan sa kalamboan gipresentar pagpagawas sa proyekto LLVM 10.0 β€” GCC-compatible nga mga himan (compilers, optimizers ug code generators), pag-compile sa mga programa ngadto sa intermediate bitcode sa RISC-like virtual nga mga instruksiyon (low-level virtual machine nga adunay multi-level optimization system). Ang namugna nga pseudocode mahimong mabag-o gamit ang JIT compiler ngadto sa mga instruksiyon sa makina direkta sa panahon sa pagpatuman sa programa.

Ang mga bag-ong bahin sa LLVM 10.0 naglakip sa suporta alang sa C ++ Concepts, wala na nagpadagan sa Clang isip usa ka bulag nga proseso, suporta alang sa CFG (control flow guard) nga mga pagsusi alang sa Windows, ug suporta alang sa bag-ong mga kapabilidad sa CPU.

Mga pagpaayo sa Clang 10.0:

  • Gidugang nga suporta alang sa "mga konsepto", usa ka extension sa template sa C++ nga iapil sa sunod nga sumbanan, gi-codenamed C++2a (gi-on sa -std=c++2a nga bandila).
    Gitugotan ka sa mga konsepto sa paghubit sa usa ka hugpong sa mga kinahanglanon sa parameter sa template nga, sa oras sa pag-compile, limitahan ang hugpong sa mga argumento nga mahimong dawaton ingon mga parameter sa template. Ang mga konsepto mahimong gamiton aron malikayan ang lohikal nga pagkasumpaki tali sa mga kabtangan sa mga tipo sa datos nga gigamit sulod sa template ug sa tipo sa datos nga mga kabtangan sa mga parameter sa input.

    template
    konsepto EqualityComparable = nagkinahanglan(T a, T b) {
    {a == b } -> std::boolean;
    {a != b } -> std::boolean;
    };

  • Sa kasagaran, ang paglansad sa usa ka bulag nga proseso ("clang -cc1") kung diin gihimo ang paghugpong gihunong. Ang pagtipon nahimo na karon sa panguna nga proseso, ug ang kapilian nga "-fno-integrated-cc1" mahimong magamit aron mapasig-uli ang daan nga pamatasan.
  • Bag-ong diagnostic mode:
    • Ang "-Wc99-designator" ug "-Wreorder-init-list" nagpasidaan batok sa paggamit sa C99 initializers sa C++ mode sa mga kaso diin kini husto sa C99 apan dili sa C++20.
    • "-Wsizeof-array-div" - makadakop sa mga sitwasyon sama sa "int arr[10]; …gidak-on(arr) / gidak-on(mubo)…” (kinahanglang β€œgidak-on(arr) / gidak-on(int)”).
    • "-Wxor-used-as-po" - nagpasidaan batok sa paggamit sa mga konstruksyon sama sa paggamit sa "^" (xor) operator sa mga operasyon nga mahimong malibog sa exponentiation (2^16).
    • "-Wfinal-dtor-non-final-class" - nagpasidaan bahin sa mga klase nga wala gimarkahan sa "katapusan" nga espesipiko, apan adunay destructor nga adunay "katapusan" nga hiyas.
    • Ang "-Wtautological-bitwise-compare" usa ka grupo sa mga pasidaan alang sa pag-diagnose sa mga tautological nga pagtandi tali sa usa ka bitwise nga operasyon ug usa ka makanunayon, ug alang sa pag-ila kanunay nga tinuod nga mga pagtandi diin ang bitwise OR nga operasyon gipadapat sa usa ka dili negatibo nga numero.
    • Ang "-Wbitwise-conditional-parentheses" nagpasidaan sa mga problema kung gisagol ang lohikal nga operator AND (&) ug OR (|) sa conditional operator (?:).
    • Ang "-Wmisleading-indentation" usa ka analogue sa tseke nga parehas nga ngalan gikan sa GCC, nga nagpasidaan bahin sa mga indented nga ekspresyon nga kung kini bahin sa usa ka kung / lain / alang / samtang bloke, apan sa tinuud wala sila gilakip sa kini nga bloke. .
    • Kung gipiho ang "-Wextra", ang tseke nga "-Wdeprecated-copy" gipalihok, nagpasidaan bahin sa paggamit sa mga konstruktor
      "move" ug "copy" sa mga klase nga adunay klaro nga destructor definition.

    • Ang "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" nga mga pagsusi gipalapdan.
    • Ang "-Wbitwise-op-parentheses" ug "-Wlogical-op-parentheses" nga mga tseke gi-disable pinaagi sa default.
  • Sa C ug C++ code, ang pointer arithmetic operations gitugotan lamang sa arrays. Ang Undefined Behavior Sanitizer sa mode nga "-fsanitize=pointer-overflow" karon makadakop sa mga kaso sama sa pagdugang og non-zero offset ngadto sa null pointer o paghimo og null pointer kung ipaubos ang integer gikan sa non-null pointer.
  • Ang "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) nga paagi gipahaom aron mahibal-an ang mga problema sa pag-uswag ug pagkunhod sa mga operasyon alang sa mga tipo nga adunay gamay nga gidak-on nga mas gamay kaysa sa "int" nga tipo.
  • Kung nagpili sa x86 nga target nga mga arkitektura "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" ug "-march=cooperlake" pinaagi sa default sa vectorized Ang Ang code mihunong sa paggamit sa 512-bit zmm registers, gawas sa ilang direktang timailhan sa source code. Ang hinungdan mao nga ang frequency sa CPU mikunhod kung nagpahigayon sa 512-bit nga mga operasyon, nga mahimong negatibo nga makaapekto sa kinatibuk-ang pasundayag. Aron mabag-o ang bag-ong pamatasan, ang kapilian nga "-mprefer-vector-width=512" gihatag.
  • Ang kinaiya sa "-flax-vector-conversions" nga bandera susama sa GCC: ang implicit vector bit conversions tali sa integer ug floating-point vectors gidili. Aron mawagtang kini nga limitasyon, gisugyot nga gamiton ang bandila
    "-flax-vector-conversions=all" nga mao ang default.

  • Gipauswag nga suporta alang sa MIPS nga mga CPU sa pamilyang Octeon. Gidugang ang "octeon+" sa lista sa balido nga mga tipo sa CPU.
  • Kung mag-assemble sa WebAssembly intermediate code, ang wasm-opt optimizer awtomatik nga gitawag, kung anaa sa sistema.
  • Alang sa mga sistema nga gibase sa arkitektura sa RISC-V, ang paggamit sa mga rehistro nga nagtipig sa mga kantidad sa floating point gitugotan sa mga conditional block sa assembler inline inserts.
  • Gidugang ang bag-ong mga flag sa compiler: "-fgnuc-version" aron itakda ang bili sa bersyon para sa "__GNUC__" ug susamang mga macro; "-fmacro-prefix-map=OLD=NEW" para ilisan ang directory prefix nga OLD ug NEW sa mga macro sama sa "__FILE__"; "-fpatchable-function-entry=N[,M]" aron makamugna og piho nga gidaghanon sa mga instruksiyon sa NOP sa wala pa ug pagkahuman sa function entry point. Alang sa RISC-V
    dugang nga suporta alang sa "-ffixed-xX", "-mcmodel=medany" ug "-mcmodel=medlow" nga mga bandera.

  • Gidugang nga suporta alang sa '__attribute__((target("branch-protection=..."))) attribute, ang epekto niini susama sa opsyon -mbranch-proteksyon.
  • Sa plataporma sa Windows, kung gipiho ang bandila nga "-cfguard", ang pag-ilis sa mga pagsusi sa integridad sa dagan sa pagpatuman (Control Flow Guard) alang sa dili direkta nga mga tawag sa function gipatuman. Aron ma-disable ang check substitution, mahimo nimong gamiton ang "-cfguard-nochecks" nga bandila o ang "__declspec(guard(nocf))" modifier.
  • Ang kinaiya sa gnu_inline attribute susama sa GCC sa mga kaso diin kini gigamit nga walay "extern" nga keyword.
  • Ang mga kapabilidad nga nalangkit sa suporta sa OpenCL ug CUDA gipalapdan. Gidugang nga suporta alang sa bag-ong mga bahin sa OpenMP 5.0.
  • Usa ka Standard nga kapilian ang gidugang sa clang-format utility, nga nagtugot kanimo sa pagtino sa bersyon sa C++ standard nga gigamit sa pag-parse ug formatting code (Latest, Auto, c++03, c++11, c++14, c++17, c++20).
  • Bag-ong mga tseke ang gidugang sa static analyzer: alpha.cplusplus.PlacementNew para mahibal-an kung adunay igong storage space, fuchsia.HandleChecker para ma-detect ang mga leaks nga may kalabutan sa mga handler sa Fuchsia, security.insecureAPI.decodeValueOfObjCType aron ma-detect ang potensyal nga buffer overflows kung gamiton ang [NSCoder decodeValueypeOfOf :sa:] .
  • Ang Undefined Behavior Sanitizer (UBSan) nagpalapad sa iyang pointer overflow checks aron makuha ang aplikasyon sa non-zero offsets ngadto sa NULL pointers o ang resulta nga pagdugang sa NULL pointer offset.
  • Sa linter clang-hinlo gidugang dako nga bahin sa bag-ong mga tseke.

nag-unang mga inobasyon LLVM 10.0:

  • Ngadto sa gambalay Atributor Bag-ong interprocedural optimizations ug analista gidugang. Ang kahimtang sa 19 ka lain-laing mga hiyas gitagna, lakip na ang 12 mga hiyas 12 LLVM IR ug 7 abstract nga mga hiyas sama sa liveness.
  • Gidugang bag-ong matrix mathematical functions nga gitukod sa compiler (Intrinsics), nga gipulihan sa episyente nga mga instruksyon sa vector sa panahon sa pag-compile.
  • Daghang mga pag-uswag ang nahimo sa mga backend alang sa X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ug PowerPC nga mga arkitektura. Gidugang nga suporta sa CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 ug Neoverse N1. Para sa ARMv8.1-M, ​​ang proseso sa paghimo og code na-optimize (pananglitan, ang suporta sa mga loop nga adunay gamay nga overhead nagpakita) ug ang suporta alang sa autovectorization gidugang gamit ang MVE extension. Gipauswag nga suporta sa CPU MIPS Octeon. Para sa PowerPC, ang vectorization sa mathematical subroutines gamit ang MASSV (Mathematical Acceleration SubSystem) library gi-enable, ang code generation gipauswag, ug ang memory access gikan sa loops gi-optimize. Para sa x86, ang pagdumala sa mga tipo sa vector v2i32, v4i16, v2i16, v8i8, v4i8 ug v2i8 nausab.

  • Gipauswag nga code generator alang sa WebAssembly. Gidugang nga suporta alang sa TLS (Thread-Local Storage) ug mga instruksiyon sa atomic.fence. Ang suporta sa SIMD labi nga gipalapdan. Ang WebAssembly object files karon adunay abilidad sa paggamit sa multi-valued function signatures.
  • Ang analisador gigamit sa pagproseso sa mga galong MemorySSA, nga nagtugot kanimo sa paghubit sa mga dependency tali sa lainlaing mga operasyon sa memorya. Ang MemorySSA makapakunhod sa oras sa pag-compile ug sa pagpatuman o mahimong gamiton imbes sa AliasSetTracker nga walay pagkawala sa performance.
  • Ang LLDB debugger nakapauswag pag-ayo sa suporta alang sa DWARF v5 format. Gipauswag nga suporta alang sa pagtukod kauban ang MinGW
    ug midugang inisyal nga abilidad sa pag-debug sa Windows executables para sa ARM ug ARM64 nga mga arkitektura. Gidugang nga mga paghubit sa mga kapilian nga gitanyag kung ang autocompleting input pinaagi sa pagpindot sa tab.

  • Gipalapdan LLD linker kapabilidad. Gipauswag nga suporta alang sa ELF format, lakip na ang bug-os nga pagkaangay sa glob templates uban sa GNU linker, midugang og suporta alang sa compressed debug nga mga seksyon ".zdebug", gidugang ang PT_GNU_PROPERTY nga propiedad aron ipasabot ang .note.gnu.property nga seksyon (magamit sa umaabot nga Linux kernels),
    Ang "-z noseparate-code", "-z separate-code" ug "-z separate-loadable-segments" nga mga mode gipatuman. Gipauswag nga suporta alang sa MinGW ug WebAssembly.

Source: opennet.ru

Idugang sa usa ka comment