Paglabas ng LLVM 10.0 compiler suite

Pagkatapos ng anim na buwan ng pag-unlad ipinakita pagpapalabas ng proyekto LLVM 10.0 β€” GCC-compatible tool (compiler, optimizer at code generators), pag-compile ng mga program sa intermediate bitcode ng RISC-like virtual instructions (low-level virtual machine na may multi-level optimization system). Ang nabuong pseudocode ay maaaring i-convert gamit ang isang JIT compiler sa mga tagubilin sa makina nang direkta sa oras ng pagpapatupad ng programa.

Kasama sa mga bagong feature sa LLVM 10.0 ang suporta para sa C++ Concepts, hindi na pinapatakbo ang Clang bilang isang hiwalay na proseso, suporta para sa CFG (control flow guard) na mga pagsusuri para sa Windows, at suporta para sa mga bagong kakayahan ng CPU.

Mga pagpapabuti sa Clang 10.0:

  • Nagdagdag ng suporta para sa "ang konsepto", isang extension ng template ng C++ na isasama sa susunod na pamantayan, na may codenamed C++2a (naka-on ng flag -std=c++2a).
    Binibigyang-daan ka ng mga konsepto na tukuyin ang isang hanay ng mga kinakailangan ng parameter ng template na, sa oras ng pag-compile, nililimitahan ang hanay ng mga argumento na maaaring tanggapin bilang mga parameter ng template. Maaaring gamitin ang mga konsepto upang maiwasan ang mga lohikal na hindi pagkakapare-pareho sa pagitan ng mga katangian ng mga uri ng data na ginamit sa loob ng template at mga katangian ng uri ng data ng mga parameter ng input.

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

  • Bilang default, ang paglulunsad ng isang hiwalay na proseso ("clang -cc1") kung saan ang compilation ay ginanap ay itinigil. Ginagawa na ngayon ang pagsasama-sama sa pangunahing proseso, at ang opsyong "-fno-integrated-cc1" ay maaaring gamitin upang maibalik ang dating gawi.
  • Mga bagong diagnostic mode:
    • Ang "-Wc99-designator" at "-Wreorder-init-list" ay nagbabala laban sa paggamit ng mga C99 initializer sa C++ mode sa mga kaso kung saan tama ang mga ito sa C99 ngunit hindi sa C++20.
    • "-Wsizeof-array-div" - nakakakuha ng mga sitwasyon tulad ng "int arr[10]; …sizeof(arr) / sizeof(short)…” (dapat ay β€œsizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - nagbabala laban sa paggamit ng mga konstruksyon tulad ng paggamit ng operator na "^" (xor) sa mga operasyon na maaaring malito sa exponentiation (2^16).
    • "-Wfinal-dtor-non-final-class" - nagbabala tungkol sa mga klase na hindi minarkahan ng "final" specifier, ngunit may destructor na may "final" attribute.
    • Ang "-Wtautological-bitwise-compare" ay isang pangkat ng mga babala para sa pag-diagnose ng mga tautological na paghahambing sa pagitan ng isang bitwise na operasyon at isang pare-pareho, at para sa pagtukoy ng palaging tunay na mga paghahambing kung saan ang bitwise OR na operasyon ay inilalapat sa isang hindi negatibong numero.
    • Ang "-Wbitwise-conditional-parentheses" ay nagbabala sa mga problema kapag pinaghahalo ang mga lohikal na operator AT (&) at OR (|) sa conditional operator (?:).
    • Ang "-Wmisleading-indentation" ay isang analogue ng tseke na may parehong pangalan mula sa GCC, na nagbabala tungkol sa mga naka-indent na expression na parang bahagi sila ng isang if/else/for/while block, ngunit sa katunayan hindi sila kasama sa block na ito .
    • Kapag tinukoy ang "-Wextra", ang tseke na "-Wdeprecated-copy" ay pinagana, nagbabala tungkol sa paggamit ng mga constructor
      "move" at "copy" sa mga klase na may tahasang destructor definition.

    • Ang "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" ay pinalawak na.
    • Ang mga tseke na "-Wbitwise-op-parentheses" at "-Wlogical-op-parentheses" ay hindi pinagana bilang default.
  • Sa C at C++ code, ang mga pagpapatakbo ng pointer arithmetic ay pinapayagan lamang sa mga array. Ang Undefined Behavior Sanitizer sa mode na "-fsanitize=pointer-overflow" ay nakakakuha na ngayon ng mga kaso gaya ng pagdaragdag ng non-zero offset sa null pointer o paggawa ng null pointer kapag binabawasan ang integer mula sa non-null pointer.
  • Ang mode na "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) ay inangkop upang matukoy ang mga problema sa pagpapatakbo ng pagtaas at pagbaba para sa mga uri na may kaunting laki na mas maliit kaysa sa uri ng "int".
  • Kapag pumipili ng x86 target na mga arkitektura na "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" at "-march=cooperlake" bilang default sa vectorized Ang ang code ay tumigil sa paggamit ng 512-bit zmm registers, maliban sa kanilang direktang indikasyon sa source code. Ang dahilan ay bumababa ang dalas ng CPU kapag nagsasagawa ng 512-bit na mga operasyon, na maaaring negatibong makaapekto sa pangkalahatang pagganap. Upang baguhin ang bagong gawi, ang opsyon na "-mprefer-vector-width=512" ay ibinigay.
  • Ang gawi ng flag na "-flax-vector-conversions" ay katulad ng GCC: ipinagbabawal ang mga implicit na vector bit conversion sa pagitan ng integer at floating-point vector. Upang maalis ang limitasyong ito, iminumungkahi na gamitin ang bandila
    "-flax-vector-conversions=all" na ang default.

  • Pinahusay na suporta para sa mga MIPS CPU ng pamilyang Octeon. Idinagdag ang "octeon+" sa listahan ng mga wastong uri ng CPU.
  • Kapag nag-assemble sa WebAssembly intermediate code, awtomatikong tinatawag ang wasm-opt optimizer, kung available sa system.
  • Para sa mga system na nakabatay sa arkitektura ng RISC-V, ang paggamit ng mga rehistro na nag-iimbak ng mga halaga ng lumulutang na punto ay pinapayagan sa mga conditional na bloke ng assembler inline insert.
  • Nagdagdag ng mga bagong flag ng compiler: "-fgnuc-version" upang itakda ang halaga ng bersyon para sa "__GNUC__" at mga katulad na macro; "-fmacro-prefix-map=OLD=NEW" upang palitan ang prefix ng direktoryo na OLD ng NEW sa mga macro gaya ng "__FILE__"; "-fpatchable-function-entry=N[,M]" upang bumuo ng isang tiyak na bilang ng mga tagubilin sa NOP bago at pagkatapos ng function entry point. Para sa RISC-V
    nagdagdag ng suporta para sa mga flag na "-ffixed-xX", "-mcmodel=medany" at "-mcmodel=medlow".

  • Nagdagdag ng suporta para sa attribute na '__attribute__((target("branch-protection=..."))), ang epekto nito ay katulad ng opsyon -mbranch-proteksyon.
  • Sa Windows platform, kapag tinukoy ang flag na "-cfguard", ipinapatupad ang pagpapalit ng mga pagsusuri sa integridad ng daloy ng pagpapatupad (Control Flow Guard) para sa mga hindi direktang function na tawag. Para i-disable ang check substitution, maaari mong gamitin ang flag na β€œ-cfguard-nochecks” o ang modifier na β€œ__declspec(guard(nocf))”.
  • Ang pag-uugali ng gnu_inline attribute ay katulad ng GCC sa mga kaso kung saan ito ay ginagamit nang walang "extern" na keyword.
  • Ang mga kakayahan na nauugnay sa suporta ng OpenCL at CUDA ay pinalawak. Nagdagdag ng suporta para sa mga bagong feature ng OpenMP 5.0.
  • Ang isang Standard na opsyon ay idinagdag sa clang-format utility, na nagbibigay-daan sa iyong matukoy ang bersyon ng C++ standard na ginagamit kapag nag-parse at nagfo-format ng code (Latest, Auto, c++03, c++11, c++14, c++17, c++20).
  • Ang mga bagong pagsusuri ay idinagdag sa static na analyzer: alpha.cplusplus.PlacementNew upang matukoy kung mayroong sapat na espasyo sa imbakan, fuchsia.HandleChecker upang matukoy ang mga paglabas na may kaugnayan sa mga humahawak ng Fuchsia, security.insecureAPI.decodeValueOfObjCType upang matukoy ang mga potensyal na buffer overflow kapag gumagamit ng [NSCoder decodeValueOfObjCType. :sa:] .
  • Pinalawak ng Undefined Behavior Sanitizer (UBSan) ang mga pagsusuri sa overflow ng pointer nito upang makuha ang application ng mga non-zero offset sa NULL pointer o ang resultang pagdaragdag ng NULL pointer offset.
  • Sa linter clang-linis idinagdag isang malaking bahagi ng mga bagong tseke.

Ang pangunahing mga inobasyon LLVM 10.0:

  • Sa balangkas Attributor Ang mga bagong interprocedural optimization at analyzer ay naidagdag. Hinulaan ang estado ng 19 na magkakaibang katangian, kabilang ang 12 katangian 12 LLVM IR at 7 abstract na katangian tulad ng liveness.
  • Nagdagdag ng bagong matrix mathematical function na nakapaloob sa compiler (Intrinsics), na pinapalitan ng mahusay na mga tagubilin sa vector sa panahon ng compilation.
  • Maraming mga pagpapabuti ang ginawa sa mga backend para sa X86, AArch64, ARM, SystemZ, MIPS, AMDGPU at PowerPC na mga arkitektura. Nagdagdag ng suporta sa CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 at Neoverse N1. Para sa ARMv8.1-M, ​​ang proseso ng pagbuo ng code ay na-optimize (halimbawa, lumitaw ang suporta para sa mga loop na may kaunting overhead) at idinagdag ang suporta para sa autovectorization gamit ang extension ng MVE. Pinahusay na suporta sa CPU MIPS Octeon. Para sa PowerPC, ang vectorization ng mathematical subroutines gamit ang MASSV (Mathematical Acceleration SubSystem) library ay pinagana, ang pagbuo ng code ay pinahusay, at ang memory access mula sa mga loop ay na-optimize. Para sa x86, binago ang pangangasiwa ng mga uri ng vector v2i32, v4i16, v2i16, v8i8, v4i8 at v2i8.

  • Pinahusay na generator ng code para sa WebAssembly. Nagdagdag ng suporta para sa TLS (Thread-Local Storage) at mga tagubilin sa atomic.fence. Ang suporta sa SIMD ay lubos na pinalawak. Ang mga file ng object ng WebAssembly ay mayroon na ngayong kakayahang gumamit ng mga signature ng multi-valued na function.
  • Ginagamit ang analyzer kapag nagpoproseso ng mga loop MemorySSA, na nagpapahintulot sa iyo na tukuyin ang mga dependencies sa pagitan ng iba't ibang mga pagpapatakbo ng memorya. Maaaring bawasan ng MemorySSA ang oras ng compilation at execution o maaaring gamitin sa halip na AliasSetTracker nang walang pagkawala ng performance.
  • Ang LLDB debugger ay may makabuluhang pinahusay na suporta para sa DWARF v5 na format. Pinahusay na suporta para sa pagbuo sa MinGW
    at nagdagdag ng paunang kakayahang i-debug ang mga executable ng Windows para sa mga arkitektura ng ARM at ARM64. Nagdagdag ng mga paglalarawan ng mga opsyon na inaalok kapag nag-autocomplete ng input sa pamamagitan ng pagpindot sa tab.

  • Pinalawak LLD linker kakayahan. Pinahusay na suporta para sa ELF format, kabilang ang pagtiyak ng ganap na compatibility ng mga template ng glob sa GNU linker, pagdaragdag ng suporta para sa mga compressed debug na seksyon na ".zdebug", pagdaragdag ng PT_GNU_PROPERTY property upang tukuyin ang .note.gnu.property na seksyon (maaaring magamit sa hinaharap Linux kernels),
    Naipatupad na ang "-z noseparate-code", "-z separate-code" at "-z separate-loadable-segments". Pinahusay na suporta para sa MinGW at WebAssembly.

Pinagmulan: opennet.ru

Magdagdag ng komento