Paglabas ng LLVM 11.0 compiler suite

Pagkatapos ng anim na buwan ng pag-unlad ipinakita pagpapalabas ng proyekto LLVM 11.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.

Ang pangunahing pagbabago sa bagong release ay ang pagsasama ng Flank, frontend para sa wikang Fortran. Sinusuportahan ng Flang ang Fortran 2018, OpenMP 4.5 at OpenACC 3.0, ngunit hindi pa natatapos ang pagbuo ng proyekto at ang front end ay limitado sa pag-parse ng code at pagsuri para sa kawastuhan. Ang pagbuo ng LLVM intermediate code ay hindi pa suportado at para makabuo ng mga executable na file, ang canonical code ay binubuo at ipinapasa sa isang external na Fortran compiler.

Mga pagpapabuti sa Clang 11.0:

  • Nagdagdag ng kakayahang ibalik ang abstract syntax tree (AST) para sa sirang C++ code, na maaaring magamit upang tumulong sa pag-diagnose ng mga error at magbigay ng karagdagang impormasyon sa mga panlabas na kagamitan tulad ng clang-tidy at clangd. Ang tampok ay pinagana bilang default para sa C++ code at kinokontrol sa pamamagitan ng "-Xclang -f[no-]recovery-ast" na mga opsyon.
  • Nagdagdag ng mga bagong diagnostic mode:
    • Ang "-Wpointer-to-int-cast" ay isang pangkat ng mga babala tungkol sa pag-cast ng mga pointer sa isang integer na uri ng int na hindi tumanggap ng lahat ng posibleng halaga.
    • "-Wuninitialized-const-reference" - babala tungkol sa pagpasa ng mga uninitialized na variable sa mga parameter ng function na tumatanggap ng mga argumento ng reference na may attribute na "const".
    • "-Wimplicit-const-int-float-conversion" - pinagana bilang default na babala tungkol sa implicit na conversion ng isang tunay na pare-pareho sa isang uri ng integer.
  • Para sa platform ng ARM, ang mga C function na nakapaloob sa compiler ay ibinigay (Intrinsics), pinalitan ng mahusay na mga tagubilin sa vector Arm v8.1-M MVE at CDE. Ang mga magagamit na function ay tinukoy sa mga file ng header arm_mve.h at arm_cde.h.
  • Idinagdag isang hanay ng mga pinahabang uri ng integer na _ExtInt(N), na nagbibigay-daan sa iyong lumikha ng mga uri na hindi multiple ng kapangyarihan ng dalawa, na maaaring mahusay na maproseso sa FPGA/HLS. Halimbawa, _ExtInt(7) ay tumutukoy sa isang uri ng integer na binubuo ng 7 bits.
  • Nagdagdag ng mga macro na tumutukoy sa suporta para sa mga built-in na C function batay sa mga tagubilin ng ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Halimbawa, ang __ARM_FEATURE_SVE macro ay tinukoy kapag bumubuo ng AArch64 code sa pamamagitan ng pagtatakda ng command line na opsyon na "-march=armv8-a+sve".

  • Ang flag na "-O" ay kinikilala na ngayon sa "-O1" optimization mode sa halip na "-O2".
  • Nagdagdag ng mga bagong flag ng compiler:
    • "-fstack-clash-protection" - nagbibigay-daan sa proteksyon laban sa mga intersection ng stack at heap.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - nagbibigay-daan sa iyong piliin ang exception handler mode para sa mga floating point na numero.
    • "-ffp-model={precise,strict,fast}" - Pinapasimple ang access sa isang serye ng mga espesyal na opsyon para sa mga numero ng floating point.
    • "-fpch-codegen" at "-fpch-debuginfo" para makabuo ng precompiled header (PCH) na may hiwalay na object file para sa code at debuginfo.
    • "-fsanitize-coverage-allowlist" at "-fsanitize-coverage-blocklist" para sa pagsuri sa saklaw ng pagsubok sa puti at itim na listahan.
    • β€œ-mtls-size={12,24,32,48}” para piliin ang laki ng TLS (thread-local storage).
    • "-menable-experimental-extension" upang paganahin ang mga pang-eksperimentong RISC-V extension.
  • Ang default na mode para sa C ay "-fno-common", na nagbibigay-daan para sa mas mahusay na pag-access sa mga pandaigdigang variable sa ilang mga platform.
  • Ang default na cache ng module ay inilipat mula sa /tmp patungo sa ~/.cache na direktoryo. Upang i-override, maaari mong gamitin ang flag na "-fmodules-cache-path=".
  • Ang default na pamantayan ng wikang C ay na-update mula gnu11 hanggang gnu17.
  • Nagdagdag ng paunang suporta para sa extension ng GNU C "asm inlineΒ»upang magdagdag ng mga assembler insert. Sinusuri pa rin ang extension, ngunit hindi pinoproseso sa anumang paraan.
  • Ang mga kakayahan na nauugnay sa suporta ng OpenCL at CUDA ay pinalawak. Nagdagdag ng suporta para sa OpenCL 2.0 block diagnostics at nagpatupad ng mga bagong feature ng OpenMP 5.0.
  • Nagdagdag ng opsyong IndentExternBlock sa clang-format na utility para sa alignment sa loob ng extern na "C" at extern na "C++" na mga bloke.
  • Pinahusay ng static analyzer ang paghawak ng mga minanang constructor sa C++. Nagdagdag ng mga bagong check na alpha.core.C11Lock at alpha.fuchsia.Lock para tingnan ang mga lock, alpha.security.cert.pos.34c para makita ang hindi ligtas na paggamit ng putenv, webkit.NoUncountedMemberChecker at webkit.RefCntblBaseVirtualDtor para makita ang mga problema sa mga hindi mabilang na uri, alpha .cplusplus .SmartPtr upang tingnan ang null smart pointer dereference.
  • Sa linter clang-linis idinagdag isang malaking bahagi ng mga bagong tseke.
  • Ang clangd caching server (Clang Server) ay nagpabuti ng pagganap at nagdagdag ng mga bagong diagnostic na kakayahan.

Ang pangunahing mga inobasyon LLVM 11.0:

  • Ang build system ay inilipat sa paggamit ng Python 3. Kung hindi available ang Python 3, posibleng i-rollback sa paggamit ng Python 2.
  • Ang front end na may compiler para sa Go language (llgo) ay hindi kasama sa release, na maaaring muling ayusin sa hinaharap.
  • Ang vector-function-abi-variant attribute ay idinagdag sa intermediate representation (IR) upang ilarawan ang pagmamapa sa pagitan ng scalar at vector function para i-vector ang mga tawag. Mula sa llvm::VectorType mayroong dalawang magkahiwalay na uri ng vector llvm::FixedVectorType at llvm::ScalableVectorType.
  • Ang pagsasanga batay sa mga halaga ng udef at pagpasa ng mga halaga ng undef sa mga karaniwang function ng library ay kinikilala bilang hindi natukoy na pag-uugali. SA
    Ang memset/memcpy/memmove ay nagpapahintulot sa pagpasa ng mga undef pointer, ngunit kung ang parameter na may sukat ay zero.

  • Nagdagdag ang LLJIT ng suporta para sa pagsasagawa ng mga static na initialization sa pamamagitan ng LLJIT::initialize at LLJIT::deinitialize na mga pamamaraan. Ang kakayahang magdagdag ng mga static na aklatan sa JITDylib gamit ang klase ng StaticLibraryDefinitionGenerator ay ipinatupad. Idinagdag ang C API para sa ORCv2 (API para sa pagbuo ng mga JIT compiler).
  • Ang suporta para sa mga processor ng Cortex-A64, Cortex-A34, Cortex-A77 at Cortex-X78 ay idinagdag sa backend para sa arkitektura ng AArch1. Ipinatupad ang ARMv8.2-BF16 (BFloat16) at ARMv8.6-A extension, kabilang ang RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) at ARMv8.0-DGH (Pahiwatig sa pangangalap ng data). Ang kakayahang bumuo ng code para sa mga built-in na function-bindings sa mga tagubilin ng vector ng SVE ay ibinigay.
  • Ang suporta para sa mga processor ng Cortex-M55, Cortex-A77, Cortex-A78 at Cortex-X1 ay idinagdag sa backend para sa arkitektura ng ARM. Ipinatupad ang mga extension
    Armv8.6-A Matrix Multiply at RMv8.2-AA32BF16 BFloat16.

  • Ang suporta para sa pagbuo ng code para sa mga processor ng POWER10 ay idinagdag sa backend para sa arkitektura ng PowerPC. Ang mga loop optimization ay pinalawak at ang floating point support ay napabuti.
  • Ang backend para sa arkitektura ng RISC-V ay nagbibigay-daan sa pagtanggap ng mga patch na sumusuporta sa mga experimental extended instruction set na hindi pa opisyal na naaprubahan.
  • Ang backend para sa arkitektura ng AVR ay inilipat mula sa pang-eksperimentong kategorya sa stable, kasama sa pangunahing pamamahagi.
  • Ang backend para sa x86 architecture ay sumusuporta sa Intel AMX at TSXLDTRK na mga tagubilin. Nagdagdag ng proteksyon laban sa mga pag-atake LVI (Load Value Injection), at nagpapatupad din ng pangkalahatang mekanismo ng Speculative Execution Side Effect Suppression upang harangan ang mga pag-atake na dulot ng speculative execution ng mga operasyon sa CPU.
  • Sa backend para sa arkitektura ng SystemZ, idinagdag ang suporta para sa MemorySanitizer at LeakSanitizer.
  • Nagdagdag ng suporta para sa header file na may mathematical constants sa Libc++ .
  • Pinalawak LLD linker kakayahan. Pinahusay na suporta para sa ELF format, kabilang ang mga idinagdag na opsyon na "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Idinagdag ang opsyong "--time-trace" upang i-save ang trace sa isang file, na pagkatapos ay masuri sa pamamagitan ng chrome://tracing interface sa Chrome.

Pinagmulan: opennet.ru

Magdagdag ng komento