Liberigo de la kompililo LLVM 11.0

Post ses monatoj da evoluo prezentita projekteldono LLVM 11.0 — GCC-kongruaj iloj (kompiloj, optimumigiloj kaj kodgeneratoroj), kompilantaj programojn en mezan bitokodon de RISC-similaj virtualaj instrukcioj (malaltnivela virtuala maŝino kun plurnivela optimumigo-sistemo). La generita pseŭdokodo povas esti konvertita uzante JIT-kompililon en maŝininstrukciojn rekte dum programekzekuto.

La ŝlosila ŝanĝo en la nova eldono estis la inkludo de Flanko, fasado por la lingvo Fortran. Flang subtenas Fortran 2018, OpenMP 4.5 kaj OpenACC 3.0, sed la evoluo de la projekto ankoraŭ ne finiĝis kaj la antaŭa finaĵo estas limigita al koda analizo kaj kontrolado de ĝusteco. Generacio de LLVM meza kodo ankoraŭ ne estas subtenata kaj por generi ruleblajn dosierojn, kanona kodo estas generita kaj pasita al ekstera Fortran-kompililo.

Plibonigoj en Clang 11.0:

  • Aldonita la kapablo restarigi la abstraktan sintaksarbon (AST) por rompita C++-kodo, kiu povas esti uzata por helpi diagnozi erarojn kaj havigi kromajn informojn al eksteraj servaĵoj kiel clang-tidy kaj clangd. La funkcio estas ebligita defaŭlte por C++-kodo kaj estas kontrolita per la opcioj "-Xclang -f[no-]recovery-ast".
  • Aldonitaj novaj diagnozaj reĝimoj:
    • "-Wpointer-to-int-cast" estas grupo de avertoj pri ĵeto de montriloj al entjera tipo int kiu ne akomodas ĉiujn eblajn valorojn.
    • "-Wuninitialized-const-reference" - averto pri transdono de nekomencigitaj variabloj en funkcioparametroj kiuj akceptas referencajn argumentojn kun la atributo "const".
    • "-Wimplicit-const-int-float-conversion" - ebligita defaŭlte averto pri implica konvertiĝo de reala konstanto al entjera tipo.
  • Por la ARM-platformo, C-funkcioj enkonstruitaj en la kompililo estas disponigitaj (Intrinseco), anstataŭigita per efikaj vektoraj instrukcioj Arm v8.1-M MVE kaj CDE. La disponeblaj funkcioj estas difinitaj en la kapdosieroj arm_mve.h kaj arm_cde.h.
  • Aldonita aro de plilongigitaj entjeroj _ExtInt(N), permesante al vi krei tipojn kiuj ne estas multobloj de potencoj de du, kiuj povas esti efike prilaboritaj sur FPGA/HLS. Ekzemple, _ExtInt(7) difinas entjeran tipon konsistantan el 7 bitoj.
  • Aldonitaj makrooj kiuj difinas subtenon por enkonstruitaj C-funkcioj bazitaj sur instrukcioj de 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. Ekzemple, la makroo __ARM_FEATURE_SVE estas difinita dum generado de AArch64-kodo agordante la komandlinian opcion "-march=armv8-a+sve".

  • La "-O" flago nun estas identigita kun la "-O1" optimumiga reĝimo anstataŭe de "-O2".
  • Aldonitaj novaj kompililoj:
    • "-fstack-clash-protection" - ebligas protekton kontraŭ intersekcoj de stako kaj amaso.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - ebligas al vi elekti la escepttraktilon por glitkomaj nombroj.
    • "-ffp-model={precise,strict,fast}" - Simpligas aliron al serio de specialigitaj opcioj por glitkomaj nombroj.
    • "-fpch-codegen" kaj "-fpch-debuginfo" por generi antaŭkompilitan kaplinion (PCH) kun apartaj objektodosieroj por kodo kaj debuginfo.
    • "-fsanitize-coverage-allowlist" kaj "-fsanitize-coverage-blocklist" por kontroli kovrotestadon de blankaj kaj nigraj listoj.
    • "-mtls-size={12,24,32,48}" por elekti la grandecon de TLS (faden-loka stokado).
    • "-menable-experimental-extension" por ebligi eksperimentajn RISC-V-etendaĵojn.
  • La defaŭlta reĝimo por C estas "-fno-common", kio permesas pli efikan aliron al tutmondaj variabloj sur kelkaj platformoj.
  • La defaŭlta modula kaŝmemoro estis movita de /tmp al la ~/.cache-dosierujo. Por anstataŭi, vi povas uzi la flagon "-fmodules-cache-path=".
  • La defaŭlta C-lingva normo estis ĝisdatigita de gnu11 al gnu17.
  • Aldonita prepara subteno por GNU C-etendo "asm inline» por aldoni enigaĵojn de asemblero. La etendo ankoraŭ estas analizita, sed neniel prilaborita.
  • La kapabloj asociitaj kun OpenCL kaj CUDA-subteno estis vastigitaj. Aldonita subteno por OpenCL 2.0 blokdiagnozo kaj efektivigis novajn OpenMP 5.0 funkciojn.
  • Aldonita IndentExternBlock opcio al clang-formata ilo por vicigo en eksteraj "C" kaj eksteraj "C++" blokoj.
  • La senmova analizilo plibonigis uzadon de hereditaj konstrukciistoj en C++. Aldonitaj novaj ĉekoj alpha.core.C11Lock kaj alpha.fuchsia.Lock por kontroli serurojn, alpha.security.cert.pos.34c por detekti nesekuran uzon de putenv, webkit.NoUncountedMemberChecker kaj webkit.RefCntblBaseVirtualDtor por detekti problemojn kun nekalkuleblaj tipoj, alpha. .cplusplus .SmartPtr por kontroli nulan inteligentan montrilon dereferencon.
  • En linter clang-tidy aldonis granda parto de novaj ĉekoj.
  • La clangd kaŝmemorservilo (Clang Server) plibonigis rendimenton kaj aldonis novajn diagnozajn kapablojn.

Ĉefa novigoj LLVM 11.0:

  • La konstrua sistemo estis ŝanĝita al uzado de Python 3. Se Python 3 ne estas disponebla, eblas reveni al uzado de Python 2.
  • La antaŭaĵo kun la kompililo por la Go-lingvo (llgo) estas ekskludita de la eldono, kiu povas esti restrukturita en la estonteco.
  • La atributo vektora-funkcio-abi-varianto estis aldonita al la meza reprezentado (IR) por priskribi la mapadon inter skalaraj kaj vektoraj funkcioj por vektorigi vokojn. De llvm::VectorType estas du apartaj vektortipoj llvm::FixedVectorType kaj llvm::ScalableVectorType.
  • Disbranĉiĝo bazita sur udef-valoroj kaj pasado de undef-valoroj al normaj bibliotekfunkcioj estas rekonita kiel nedifinita konduto. EN
    memset/memcpy/memmove permesas pasi undef-montrilojn, sed se la parametro kun grandeco estas nulo.

  • LLJIT aldonis subtenon por farado de senmovaj inicialigoj per la metodoj LLJIT::initialize kaj LLJIT::deinitialize. La kapablo aldoni senmovajn bibliotekojn al JITDylib uzante la StaticLibraryDefinitionGenerator-klason estis efektivigita. Aldonita C API por ORCv2 (API por konstrui JIT-kompililojn).
  • Subteno por Cortex-A64, Cortex-A34, Cortex-A77 kaj Cortex-X78-procesoroj estis aldonita al la backend por la AArch1-arkitekturo. Efektivigite ARMv8.2-BF16 (BFloat16) kaj ARMv8.6-A etendaĵoj, inkluzive de RMv8.6-ECV (Plibonigita Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) kaj ARMv8.0-DGH (sugesto pri kolektado de datumoj). La kapablo generi kodon por enkonstruitaj funkcio-ligoj al SVE-vektorinstrukcioj estas disponigita.
  • Subteno por Cortex-M55, Cortex-A77, Cortex-A78 kaj Cortex-X1-procesoroj estis aldonita al la backend por la ARM-arkitekturo. Etendaĵoj efektivigitaj
    Armv8.6-A Matrix Multiply kaj RMv8.2-AA32BF16 BFloat16.

  • Subteno por kodgenerado por POWER10-procesoroj estis aldonita al la backend por la arkitekturo PowerPC. Buklooptimumigoj estis vastigitaj kaj glitkoma subteno estis plibonigita.
  • La backend por la RISC-V-arkitekturo permesas la akcepton de pecetoj kiuj subtenas eksperimentajn plilongigitajn instrukciojn kiuj ankoraŭ ne estis oficiale aprobitaj.
  • La backend por la AVR-arkitekturo estis translokigita de la eksperimenta kategorio al stabila, inkluzivita en la baza distribuo.
  • La backend por x86-arkitekturo subtenas instrukciojn de Intel AMX kaj TSXLDTRK. Aldonita protekto kontraŭ atakoj LVI (Load Value Injection), kaj ankaŭ efektivigas ĝeneralan Speculative Execution Side Effect Suppression-mekanismon por bloki atakojn kaŭzitajn de konjekta ekzekuto de operacioj sur la CPU.
  • En la backend por la arkitekturo SystemZ, subteno por MemorySanitizer kaj LeakSanitizer estis aldonita.
  • Aldonita subteno por titoldosiero kun matematikaj konstantoj al Libc++ .
  • Vastigita LLD-ligilkapabloj. Plibonigita subteno por la ELF-formato, inkluzive de la aldonitaj opcioj "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- unu-modulo", "-unique", "-rosegment", "-fadenoj=N". Aldonita "--time-trace" opcio por konservi la spuron al dosiero, kiu tiam povas esti analizita per la chrome://tracing-interfaco en Chrome.

fonto: opennet.ru

Aldoni komenton