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

Pas gjashtë muajsh zhvillimi, prezantohet publikimi i projektit LLVM 13.0 - një paketë veglash e pajtueshme me GCC (përpiluesit, optimizuesit dhe gjeneruesit e kodeve) që përpilon programet në një bitkod të ndërmjetëm të udhëzimeve virtuale të ngjashme me RISC (një makinë virtuale e nivelit të ulët me një sistem optimizimi me shumë nivele). Pseudokodi i gjeneruar mund të konvertohet nga përpiluesi JIT në udhëzime të makinës pikërisht në momentin e ekzekutimit të programit.

Përmirësime në Clang 13.0:

  • Mbështetje e zbatuar për thirrjet e garantuara të bishtit (thirrja e një nënprogrami në fund të një funksioni, duke formuar një rekursion të bishtit nëse nënprogrami thërret veten). Mbështetja për thirrjet e garantuara të bishtit ofrohet nga atributi "[[clang::musttail]]" në C++ dhe "__attribute__((musttail))" në C, i përdorur në një deklaratë "kthimi". Veçoria ju lejon të zbatoni optimizime duke vendosur kodin në një përsëritje të sheshtë për të kursyer konsumin e stivës.
  • Deklaratat "përdorimi" dhe shtesat clang ofrojnë mbështetje për përcaktimin e atributeve të stilit C++11 duke përdorur formatin "[[]]".
  • U shtua flamuri "-Wreserved-identifier" për të shfaqur një paralajmërim kur identifikuesit e rezervuar janë specifikuar në kodin e përdoruesit.
  • U shtuan flamujt "-Wunused-but-set-parameter" dhe "-Wunused-but-set-variable" për të shfaqur një paralajmërim nëse një parametër ose ndryshore është vendosur por nuk përdoret.
  • U shtua flamuri "-Wnull-pointer-subtraction" për të lëshuar një paralajmërim nëse kodi mund të sjellë sjellje të papërcaktuar për shkak të përdorimit të një treguesi null në operacionet e zbritjes.
  • U shtua flamuri "-fstack-usage" për të gjeneruar për çdo skedar kodi një skedar shtesë ".su" që përmban informacion në lidhje me madhësinë e kornizave të stivës për çdo funksion të përcaktuar në skedarin që përpunohet.
  • Një lloj i ri i daljes është shtuar në analizuesin statik - "sarif-html", i cili çon në gjenerimin e raporteve në të njëjtën kohë në formatet HTML dhe Sarif. Është shtuar kontrolli i ri allocClassWithName. Kur specifikoni opsionin "-analyzer-display-progress", shfaqet koha e analizës së secilit funksion. Analizuesi inteligjent i treguesit (alpha.cplusplus.SmartPtr) është pothuajse gati.
  • Aftësitë që lidhen me mbështetjen e OpenCL janë zgjeruar. Mbështetje e shtuar për shtesat e reja cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields dhe __cl_clang_non_portable_kernel_param_types. Zbatimi i specifikimit OpenCL 3.0 ka vazhduar. Për C, specifikimi OpenCL 1.2 përdoret si parazgjedhje, përveç nëse zgjidhet në mënyrë eksplicite një version tjetër. Për C++, është shtuar mbështetje për skedarët me shtesën “.clcpp”.
  • Është zbatuar mbështetja për direktivat e transformimit të ciklit ("#pragma omp unrol" dhe "#pragma omp tile") të përcaktuara në specifikimin OpenMP 5.1.
  • Opsionet e shtuara në mjetin e formatit clang: SpacesInLineCommentPrefix për të përcaktuar numrin e hapësirave përpara komenteve, IndentAccessModifiers, LambdaBodyIndentation dhe PPIndentWidth për të kontrolluar shtrirjen e hyrjeve, shprehjet lambda dhe direktivat e paraprocesorit. Mundësitë për renditjen e numërimit të skedarëve të kokës (SortIncludes) janë zgjeruar. Mbështetje e shtuar për formatimin e skedarëve JSON.
  • Një pjesë e madhe e çeqeve të reja i janë shtuar trokitjes së sipërme.

Risitë kryesore në LLVM 13.0:

  • U shtua opsioni "-ehcontguard" për të përdorur teknologjinë CET (Windows Control-flow Enforcement Technology) për të mbrojtur kundër ekzekutimit të shfrytëzimeve të ndërtuara duke përdorur teknikat e Programimit të Orientuar në Kthim (ROP) në fazën e trajtimit të përjashtimeve.
  • Projekti i debuginfo-test është riemërtuar në testet ndër-projektale dhe është krijuar për të testuar komponentë nga projekte të ndryshme, duke mos u kufizuar në informacionin e korrigjimit.
  • Sistemi i montimit ofron mbështetje për ndërtimin e disa shpërndarjeve, për shembull, njëra me shërbimet komunale dhe tjetra me biblioteka për zhvilluesit.
  • Në prapavijën për arkitekturën AArch64, mbështetja për zgjerimet Armv9-A RME (Zgjerimi i Menaxhimit të Realitetit) dhe SME (Zgjerimi i Matricës së Shkallëzueshme) zbatohet në asembler.
  • Mbështetja për ISA V68/HVX është shtuar në backend për arkitekturën Hexagon.
  • Backend-i x86 ka përmirësuar mbështetjen për procesorët AMD Zen 3.
  • Mbështetje e shtuar për GFX1013 RDNA2 APU në backendin AMDGPU.
  • Libc++ vazhdon të zbatojë veçori të reja të standardeve C++20 dhe C++2b, duke përfshirë kompletimin e bibliotekës “koncepte”. Mbështetje e shtuar për std::sistemin e skedarëve për platformën Windows të bazuar në MinGW. Skedarët e kokës të ndara , Dhe . U shtua opsioni i ndërtimit LIBCXX_ENABLE_INCOMPLETE_FEATURES për të çaktivizuar skedarët e kokës me funksionalitet të pa implementuar plotësisht.
  • Janë zgjeruar aftësitë e lidhësit LLD, në të cilin zbatohet mbështetja për procesorët Big-endian Aarch64, dhe prapavija Mach-O është sjellë në një gjendje që lejon lidhjen e programeve të rregullta. Përfshihen përmirësime të nevojshme për të lidhur Glibc duke përdorur LLD.
  • Shërbimi llvm-mca (Analyzer i kodit të makinës) ka shtuar mbështetje për procesorët që ekzekutojnë udhëzimet sipas rregullit (pipeline superscalar sipas rendit), siç është ARM Cortex-A55.
  • Debuger LLDB për platformën AArch64 ofron mbështetje të plotë për Pointer Authentication, MTE (MemTag, Memory Tagging Extension) dhe regjistrat SVE. U shtuan komanda që ju lejojnë të lidhni etiketat me çdo operacion të shpërndarjes së memories dhe të organizoni një kontroll të treguesit kur qaseni në kujtesë, i cili duhet të shoqërohet me etiketën e duhur.
  • Korrigjuesi LLDB dhe pjesa e përparme për gjuhën Fortran - Flang janë shtuar në asambletë binare të krijuara nga projekti.

Burimi: opennet.ru

Shto një koment