Paglabas ng LLVM 12.0 compiler suite

Pagkatapos ng anim na buwan ng pag-unlad, ipinakita ang paglabas ng proyekto ng LLVM 12.0 - isang toolkit na katugma sa GCC (mga compiler, optimizer at code generator) na nagsasama-sama ng mga programa sa intermediate bitcode ng tulad ng RISC na virtual na mga tagubilin (isang mababang antas na virtual machine na may isang multi-level optimization system). Ang nabuong pseudocode ay maaaring ma-convert gamit ang isang JIT compiler sa mga tagubilin sa makina nang direkta sa oras ng pagpapatupad ng programa.

Mga Pagpapabuti sa Clang 12.0:

  • Ang suporta para sa "malamang" at "hindi malamang" na mga katangian na iminungkahi sa pamantayan ng C++20 ay ipinatupad at pinagana bilang default, na nagpapahintulot sa optimizer na malaman ang tungkol sa posibilidad na ma-trigger ang conditional construct (halimbawa, "[[malamang] ]] kung (random > 0) {β€œ).
  • Nagdagdag ng suporta para sa mga processor ng AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) at Intel Sapphire Rapids (-march=sapphirerapids).
  • Nagdagdag ng suporta para sa mga flag na "-march=x86-64-v[234]" para pumili ng mga antas ng arkitektura ng x86-64 (v2 - sumasaklaw sa mga extension ng SSE4.2, SSSE3, POPCNT at CMPXCHG16B; v3 - AVX2 at MOVBE; v4 - AVX-512 ).
  • Nagdagdag ng suporta para sa mga processor ng Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) at Fujitsu A64FX (a64fx). Halimbawa, upang paganahin ang mga pag-optimize para sa mga Neoverse-V1 na CPU, maaari mong tukuyin ang "-mcpu=neoverse-v1".
  • Para sa arkitektura ng AArch64, ang mga bagong compiler na flag na "-moutline-atomics" at "-mno-outline-atomics" ay idinagdag upang paganahin o huwag paganahin ang mga function ng atomic operation helper, gaya ng "__aarch64_cas8_relax". Nakikita ng mga naturang function sa runtime kung available ang suporta ng LSE (Large System Extensions) at ginagamit ang ibinigay na mga tagubilin ng atomic processor o bumalik sa paggamit ng mga tagubilin sa LL/SC (Load-link/store-conditional) para sa pag-synchronize.
  • Idinagdag ang opsyong "-fbinutils-version" upang piliin ang target na bersyon ng binutils suite para sa pagiging tugma sa mas lumang linker at gawi ng assembler.
  • Para sa ELF executable file, kapag tinukoy ang flag na "-gz", ang compression ng impormasyon sa pag-debug gamit ang zlib library ay pinapagana bilang default (gz=zlib). Ang pag-link sa mga resultang object file ay nangangailangan ng lld o GNU binutils 2.26+. Upang maibalik ang pagiging tugma sa mga mas lumang bersyon ng mga binutil, maaari mong tukuyin ang "-gz=zlib-gnu".
  • Ang pointer na 'ito' ay pinoproseso na ngayon gamit ang mga nonnull at dereferenceable(N) na pagsusuri. Upang alisin ang nonnull attribute, kung kailangan mong gumamit ng NULL values, maaari mong gamitin ang opsyong "-fdelete-null-pointer-checks".
  • Sa platform ng Linux, ang "-fasynchronous-unwind-tables" na mode ay pinagana para sa AArch64 at PowerPC architectures upang makabuo ng mga unwind call table, tulad ng sa GCC.
  • Sa "#pragma clang loop vectorize_width" idinagdag ang kakayahang tukuyin ang "fixed" (default) at "scalable" na mga opsyon upang piliin ang paraan ng vectorization. Ang "scalable" na mode, na independiyente sa haba ng vector, ay eksperimental at maaaring gamitin sa hardware na sumusuporta sa scalable vectorization.
  • Pinahusay na suporta para sa Windows platform: Ang mga opisyal na binary assemblies para sa Windows sa Arm64 system ay inihanda, kasama ang Clang compiler, LLD linker at compiler-rt runtime library. Kapag nagtatayo para sa MinGW na mga target na platform, ang .exe suffix ay idinaragdag, kahit na kapag nagko-cross-compile.
  • Ang mga kakayahan na nauugnay sa suporta para sa OpenCL, OpenMP at CUDA ay pinalawak. Nagdagdag ng mga opsyon na "-cl-std=CL3.0" at "-cl-std=CL1.0" upang pumili ng mga macro na opsyon para sa OpenCL 3.0 at OpenCL 1.0. Ang mga tool sa diagnostic ay pinalawak.
  • Nagdagdag ng suporta para sa mga tagubiling HRESET, UITR, at AVXVNNI na ipinatupad sa ilang mga processor na nakabatay sa x86.
  • Sa mga x86 system, pinagana ang suporta para sa opsyong "-mtune=", na pinapagana ang mga napiling microarchitectural optimization anuman ang halaga ng "-march=".
  • Ang static analyzer ay nagpabuti ng pagproseso ng ilang mga function ng POSIX at makabuluhang pinabuting pagpapasiya ng resulta ng mga kondisyong operasyon kapag mayroong ilang mga simbolikong halaga sa paghahambing. Nagdagdag ng mga bagong tseke: fuchia.HandleChecker (tinutukoy ang mga handle sa mga istruktura), webkit.UncountedLambdaCapturesChecker webkit at alpha.webkit.UncountedLocalVarsChecker (isinasaalang-alang ang mga kakaibang pagtatrabaho sa mga pointer sa WebKit engine code).
  • Sa mga expression na ginamit sa konteksto ng mga constant, ang paggamit ng mga built-in na function __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd, __bsd64 bswapq , _castf*, __rol* at __ror*.
  • Nagdagdag ng opsyong BitFieldColonSpacing sa clang-format na utility para piliin ang spacing sa paligid ng mga identifier, column, at field definition.
  • Ang clangd caching server (Clang Server) sa platform ng Linux ay makabuluhang nabawasan ang pagkonsumo ng memorya sa panahon ng pangmatagalang operasyon (ang mga pana-panahong tawag sa malloc_trim ay ibinibigay upang ibalik ang mga libreng pahina ng memorya sa operating system).

Mga pangunahing inobasyon sa LLVM 12.0:

  • Ang suporta para sa llvm-build build tool na nakasulat sa Python ay hindi na ipinagpatuloy, at sa halip ang proyekto ay ganap na lumipat sa paggamit ng CMake build system.
  • Sa backend para sa arkitektura ng AArch64, ang suporta para sa Windows platform ay napabuti: ang tamang henerasyon ng assembler na output para sa mga target na Windows system ay natiyak, ang pagbuo ng data sa mga unwind call ay na-optimize (ang laki ng naturang data ay nabawasan ng 60 %), ang kakayahang lumikha ng unwind data gamit ang assembler ay naidagdag na mga direktiba .seh_*.
  • Nagtatampok ang backend para sa arkitektura ng PowerPC ng mga bagong pag-optimize para sa mga loop at inline na pag-deploy, pinalawak na suporta para sa mga processor ng Power10, nagdagdag ng suporta para sa mga tagubilin sa MMA para sa pagmamanipula ng matrix, at pinahusay na suporta para sa operating system ng AIX.
  • Ang backend ng x86 ay nagdaragdag ng suporta para sa mga processor ng AMD Zen 3, Intel Alder Lake at Intel Sapphire Rapids, pati na rin ang mga tagubilin ng processor ng HRESET, UITR at AVXVNNI. Suporta para sa MPX (Memory Protection Extension) para sa pagsuri ng mga pointer upang matiyak na hindi na sinusuportahan ang mga hangganan ng memorya (ang teknolohiyang ito ay hindi laganap at naalis na sa GCC at clang). Nagdagdag ng suporta sa assembler para sa mga prefix na {disp32} at {disp8} at sa mga .d32 at .d8 na suffix para makontrol ang laki ng mga offset at jump ng operand. Nagdagdag ng bagong attribute na "tune-cpu" para kontrolin ang pagsasama ng mga microarchitectural optimization.
  • Ang isang bagong mode na "-fsanitize=unsigned-shift-base" ay idinagdag sa integer problem detector (integer sanitizer, "-fsanitize=integer") upang matukoy ang mga overflow ng mga unsigned integer pagkatapos ng kaunting paglipat sa kaliwa.
  • Sa iba't ibang mga detector (asan, cfi, lsan, msan, tsan, ubsan sanitizer) ang suporta para sa mga pamamahagi ng Linux na may karaniwang Musl library ay naidagdag.
  • Ang mga kakayahan ng LLD linker ay pinalawak. Pinahusay na suporta para sa ELF format, kasama ang mga idinagdag na opsyon na β€œ--dependency-file”, β€œ-error-handling-script”, β€œ-lto-pseudo-probe-for-profiling”, β€œ-no-lto-whole-program -visibility" " Pinahusay na suporta sa MinGW. Para sa Mach-O na format (macOS), ipinatupad ang suporta para sa arm64, arm, at i386 architecture, link-time optimizations (LTO), at stack unwinding para sa exception handling.
  • Ang Libc++ ay nagpapatupad ng mga bagong feature ng C++20 standard at sinimulan na ang pagbuo ng mga feature ng C++2b specification. Nagdagdag ng suporta para sa pagbuo na may hindi pagpapagana ng suporta sa localization (β€œ-DLIBCXX_ENABLE_LOCALIZATION=OFF”) at mga device para sa pagbuo ng mga pseudo-random na numero (β€œ-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Pinagmulan: opennet.ru

Magdagdag ng komento