Lëshimi i paketës së përpiluesit LLVM 11.0

Pas gjashtë muajsh zhvillimi prezantuar publikimi i projektit LLVM 11.0 — Mjete të përputhshme me GCC (përpiluesit, optimizuesit dhe gjeneruesit e kodeve), përpilimi i programeve në bitkod të ndërmjetëm të instruksioneve virtuale të ngjashme me RISC (makinë virtuale e nivelit të ulët me një sistem optimizimi me shumë nivele). Pseudokodi i gjeneruar mund të konvertohet duke përdorur një përpilues JIT në udhëzime makine direkt në kohën e ekzekutimit të programit.

Ndryshimi kryesor në versionin e ri ishte përfshirja e Krah, një frontend për gjuhën Fortran. Flang mbështet Fortran 2018, OpenMP 4.5 dhe OpenACC 3.0, por zhvillimi i projektit nuk ka përfunduar ende dhe pjesa e përparme është e kufizuar në analizimin e kodit dhe kontrollimin e korrektësisë. Gjenerimi i kodit të ndërmjetëm LLVM nuk mbështetet ende dhe për të gjeneruar skedarë të ekzekutueshëm, krijohet kodi kanonik dhe i kalohet një përpiluesi të jashtëm Fortran.

Përmirësimet në Clang 11.0:

  • U shtua aftësia për të rivendosur pemën e sintaksës abstrakte (AST) për kodin e prishur C++, i cili mund të përdoret për të ndihmuar në diagnostikimin e gabimeve dhe ofron informacion shtesë për shërbimet e jashtme si clang-tidy dhe clangd. Veçoria është aktivizuar si parazgjedhje për kodin C++ dhe kontrollohet përmes opsioneve "-Xclang -f[no-]recovery-ast".
  • U shtuan mënyra të reja diagnostikuese:
    • "-Wpointer-to-int-cast" është një grup paralajmërimesh në lidhje me hedhjen e treguesve në një lloj int të plotë që nuk i përshtat të gjitha vlerat e mundshme.
    • “-Wuninitialized-const-reference” - paralajmërim për kalimin e variablave të painitializuar në parametrat e funksionit që pranojnë argumente referimi me atributin “const”.
    • "-Wimplicit-const-int-float-conversion" - aktivizuar si parazgjedhje paralajmërimin për konvertimin e nënkuptuar të një konstante reale në një tip numër të plotë.
  • Për platformën ARM, ofrohen funksionet C të integruara në përpilues (Intrinsics), i zëvendësuar nga instruksionet efikase të vektorit Arm v8.1-M MVE dhe CDE. Funksionet e disponueshme janë të përcaktuara në skedarët e kokës arm_mve.h dhe arm_cde.h.
  • Shtuar një grup i llojeve të numrave të plotë të zgjeruar _ExtInt(N), që ju lejon të krijoni lloje që nuk janë shumëfish të fuqive të dy, të cilat mund të përpunohen në mënyrë efikase në FPGA/HLS. Për shembull, _ExtInt(7) përcakton një tip numër të plotë të përbërë nga 7 bit.
  • Makro të shtuara që përcaktojnë mbështetjen për funksionet e integruara C bazuar në udhëzimet e 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. Për shembull, makroja __ARM_FEATURE_SVE përcaktohet kur gjenerohet kodi AArch64 duke vendosur opsionin e linjës së komandës "-marsh=armv8-a+sve".

  • Flamuri "-O" tani identifikohet me modalitetin e optimizimit "-O1" në vend të "-O2".
  • U shtuan flamuj të rinj përpilues:
    • "-fstack-clash-protection" - mundëson mbrojtjen kundër kryqëzimet e pirgut dhe grumbullit.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - ju lejon të zgjidhni modalitetin e mbajtësit të përjashtimeve për numrat me pikë lundruese.
    • "-ffp-model={precise,strict,fast}" - Thjeshtëson aksesin në një seri opsionesh të specializuara për numrat me pikë lundruese.
    • "-fpch-codegen" dhe "-fpch-debuginfo" për të gjeneruar një kokë të parakompiluar (PCH) me skedarë objektesh të veçantë për kodin dhe informacionin e korrigjimit.
    • "-fsanitize-coverage-allowlist" dhe "-fsanitize-coverage-blocklist" për kontrollimin e listave të bardha dhe të zeza të testimit të mbulimit.
    • “-mtls-size={12,24,32,48}” për të zgjedhur madhësinë TLS (fije-ruajtje lokale).
    • "-menable-experimental-extension" për të aktivizuar shtesat eksperimentale RISC-V.
  • Modaliteti i parazgjedhur për C është "-fno-common", i cili lejon qasje më efikase në variablat globale në disa platforma.
  • Memoria e paracaktuar e modulit është zhvendosur nga /tmp në drejtorinë ~/.cache. Për të anashkaluar, mund të përdorni flamurin “-fmodules-cache-path=”.
  • Standardi i parazgjedhur i gjuhës C është përditësuar nga gnu11 në gnu17.
  • U shtua mbështetje paraprake për zgjerimin GNU C "asm inline» për të shtuar inserte të montimit. Zgjerimi është ende duke u analizuar, por nuk përpunohet në asnjë mënyrë.
  • Aftësitë që lidhen me mbështetjen e OpenCL dhe CUDA janë zgjeruar. Shtoi mbështetje për diagnostikimin e bllokut OpenCL 2.0 dhe zbatoi veçori të reja OpenMP 5.0.
  • U shtua opsioni IndentExternBlock në mjetin e formatit clang për shtrirje brenda blloqeve të jashtme "C" dhe të jashtme "C++".
  • Analizuesi statik ka përmirësuar trajtimin e konstruktorëve të trashëguar në C++. U shtuan kontrolle të reja alpha.core.C11Lock dhe alpha.fuchsia.Lock për të kontrolluar për bravë, alpha.security.cert.pos.34c për të zbuluar përdorimin e pasigurt të putenv, webkit.NoUncountedMemberChecker dhe webkit.RefCntblBaseVirtualDtor për të zbuluar problemet me alpha të panumërueshme .cplusplus .SmartPtr për të kontrolluar mosreferencimin e treguesit inteligjent null.
  • Në linter tingëllon-i rregullt shtuar një pjesë e madhe e çeqeve të reja.
  • Serveri clangd caching (Clang Server) ka përmirësuar performancën dhe ka shtuar aftësi të reja diagnostikuese.

Kryesore risitë LLVM 11.0:

  • Sistemi i ndërtimit është kaluar në përdorimin e Python 3. Nëse Python 3 nuk është i disponueshëm, është e mundur të ktheheni në përdorimin e Python 2.
  • Pjesa e përparme me përpiluesin për gjuhën Go (llgo) është e përjashtuar nga publikimi, i cili mund të ristrukturohet në të ardhmen.
  • Atributi vector-function-abi-variant është shtuar në paraqitjen e ndërmjetme (IR) për të përshkruar hartëzimin midis funksioneve skalare dhe vektoriale për të vektorizuar thirrjet. Nga llvm::VectorType ekzistojnë dy lloje vektoriale të veçanta llvm::FixedVectorType dhe llvm::ScalableVectorType.
  • Degëzimi i bazuar në vlerat udef dhe kalimi i vlerave undef në funksionet standarde të bibliotekës njihet si sjellje e papërcaktuar. NË
    memset/memcpy/memmove lejon kalimin e treguesve undef, por nëse parametri me madhësi është zero.

  • LLJIT ka shtuar mbështetje për kryerjen e inicializimeve statike përmes metodave LLJIT::initialize dhe LLJIT::deinitialize. Është zbatuar aftësia për të shtuar biblioteka statike në JITDylib duke përdorur klasën StaticLibraryDefinitionGenerator. U shtua C API për ORCv2 (API për ndërtimin e përpiluesve JIT).
  • Mbështetja për procesorët Cortex-A64, Cortex-A34, Cortex-A77 dhe Cortex-X78 është shtuar në backend për arkitekturën AArch1. Zgjerime të implementuara ARMv8.2-BF16 (BFloat16) dhe ARMv8.6-A, duke përfshirë RMv8.6-ECV (Virtualizimi i Kundërvënës i Përmirësuar), ARMv8.6-FGT (Kurthe me grimca të imta), ARMv8.6-AMU (Virtualizimi i monitoruesve të aktivitetit) dhe ARMv8.0-DGH (Udhëzim për mbledhjen e të dhënave). Mundësia për të gjeneruar kodin për funksionet e integruara-lidhjet me udhëzimet e vektorit SVE ofrohet.
  • Mbështetja për procesorët Cortex-M55, Cortex-A77, Cortex-A78 dhe Cortex-X1 është shtuar në backend për arkitekturën ARM. Zgjerimet e zbatuara
    Armv8.6-A Matrica Multiply dhe RMv8.2-AA32BF16 BFloat16.

  • Mbështetja për gjenerimin e kodit për procesorët POWER10 është shtuar në backend për arkitekturën PowerPC. Optimizimi i ciklit është zgjeruar dhe mbështetja me pikë lundruese është përmirësuar.
  • Backend-i për arkitekturën RISC-V lejon pranimin e arnimeve që mbështesin grupe instruksionesh të zgjeruara eksperimentale që nuk janë miratuar ende zyrtarisht.
  • Backend-i për arkitekturën AVR është transferuar nga kategoria eksperimentale në stabile, e përfshirë në shpërndarjen bazë.
  • Backend për arkitekturën x86 mbështet udhëzimet Intel AMX dhe TSXLDTRK. Mbrojtje e shtuar kundër sulmeve LVI (Injeksioni i vlerës së ngarkesës), dhe gjithashtu zbaton një mekanizëm të përgjithshëm të shtypjes së efekteve anësore të ekzekutimit spekulativ për të bllokuar sulmet e shkaktuara nga ekzekutimi spekulativ i operacioneve në CPU.
  • Në backend për arkitekturën SystemZ, është shtuar mbështetja për MemorySanitizer dhe LeakSanitizer.
  • U shtua mbështetje për skedarin e kokës me konstante matematikore në Libc++ .
  • Zgjeruar Aftësitë lidhëse LLD. Mbështetje e përmirësuar për formatin ELF, duke përfshirë shtimin e opsioneve "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", “-thinlto- single-modul”, “-unike”, “-rosegment”, “-threads=N”. U shtua opsioni "--time-trace" për të ruajtur gjurmën në një skedar, i cili më pas mund të analizohet nëpërmjet ndërfaqes chrome://tracing në Chrome.

Burimi: opennet.ru

Shto një koment