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

Pas gjashtë muajsh zhvillimi, prezantohet publikimi i projektit LLVM 16.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 të mëdha në Clang 16.0:

  • Standardi i parazgjedhur C++/ObjC++ është vendosur në gnu++17 (më parë gnu++14), që nënkupton mbështetje për veçoritë C++17 me shtesa GNU si parazgjedhje. Mund të përdorni opsionin "-std=gnu++14" për t'u rikthyer në sjelljen e mëparshme.
  • Funksione të avancuara të implementuara në lidhje me standardin C++20:
    • Funksionet e veçanta të anëtarëve të parëndësishëm me kusht,
    • kapja e lidhjeve të strukturuara në funksionet lambda,
    • Operatori i barazisë brenda shprehjeve,
    • Aftësia për të mos specifikuar fjalën kyçe të emrit të tipit në disa kontekste,
    • Lejimi i inicializimit të agregatit në kllapa ("Aggr(val1, val2)").
  • Karakteristikat e implementuara të përcaktuara në standardin e ardhshëm C++2b:
    • Etiketat lejohen në fund të shprehjeve të përbëra,
    • operator statik (),
    • operator statik[],
    • Ofrohet përputhshmëri me llojin char8_t,
    • Gama e karaktereve të lejuara për përdorim në "\N{...}" është zgjeruar,
    • U shtua aftësia për të përdorur variabla të deklaruara si "static constexpr" në funksionet e deklaruara si constexpr.
  • Karakteristikat e implementuara të përcaktuara në standardin e ardhshëm C2x C:
    • Për të çaktivizuar paralajmërimin "-Wunused-label", atributi "[[maybe_unused]]" mund të zbatohet për etiketat
    • Etiketat mund të vendosen kudo brenda shprehjeve të përbëra,
    • U shtuan operatorët typeof dhe typeof_unqual,
    • Një lloj i ri nullptr_t dhe një konstante nullptr për të përcaktuar treguesit null që mund të konvertohen në çdo lloj treguesi dhe përfaqësojnë një variant të NULL që nuk është i lidhur me llojet integrale dhe void*.
    • Në modalitetin C2x, lejohet thirrja e makros va_start me një numër të ndryshueshëm argumentesh (variadike).
  • Në modalitetet e konformitetit C99, C11 dhe C17, opsionet "-Wimplicit-function-declaration" dhe "-Wimplicit-int" tani prodhojnë një gabim në vend të një paralajmërimi si parazgjedhje.
  • Përdorimi indirekt i "void *" (për shembull, "void func(void *p) { *p; }") në modalitetin C++ tani gjeneron një gabim, të ngjashëm me ISO C++, GCC, ICC dhe MSVC.
  • Specifikimi i fushave bit si operandë udhëzimi (p.sh. "__asm ​​{ mov eax, s.bf }") në blloqet e montimit inline të stilit Microsoft tani gjeneron një gabim.
  • Diagnostifikimi i shtuar për praninë e strukturave dhe unioneve të ndryshme me emra të njëjtë në module të ndryshme.
  • Aftësi të zgjeruara në lidhje me mbështetjen për OpenCL dhe OpenMP. Diagnostifikimi i përmirësuar i shablloneve C++ të përdorur në argumentet e kernelit OpenCL. Mbështetje e përmirësuar e bllokut të radhës për AMDGPU. Atributi nounwind u shtohet në mënyrë implicite të gjitha funksioneve. Mbështetje e përmirësuar për funksionet e integruara.
  • Ofron mundësinë për të përdorur variablin e mjedisit CLANG_CRASH_DIAGNOSTICS_DIR për të përcaktuar drejtorinë ku ruhen të dhënat e diagnostikimit të përplasjeve.
  • Mbështetja e Unicode është përditësuar në specifikimin Unicode 15.0. Disa simbole matematikore lejohen në identifikues, të tillë si "₊" (për shembull, "xₖ₊XNUMX" i dyfishtë).
  • Mbështetje e shtuar për ngarkimin e skedarëve të shumtë të konfigurimit (skedarët e konfigurimit të parazgjedhur ngarkohen së pari, dhe më pas ato të specifikuara përmes flamurit "--config=", i cili tani mund të specifikohet disa herë). Rendi i ngarkimit të skedarit të konfigurimit të paracaktuar është ndryshuar: clang përpiqet të ngarkojë skedarin së pari - .cfg dhe nëse nuk gjendet, përpiqet të ngarkojë dy skedarë .cfg dhe .cfg. U shtua flamuri "--no-default-config" për të çaktivizuar ngarkimin e skedarëve të konfigurimit si parazgjedhje.
  • Për të siguruar ndërtime të përsëritshme, është e mundur të zëvendësohen vlerat aktuale të datës dhe orës në makrot __DATE__, __TIME__ dhe __TIMESTAMP__ me kohën e specifikuar në ndryshoren e mjedisit SOURCE_DATE_EPOCH.
  • Për të kontrolluar funksionet e integruara (të integruara) që mund të përdoren në kontekstin e konstanteve, është shtuar makroja "__has_constexpr_builtin".
  • U shtua flamuri i ri përpilues "-fcoro-aligned-allocation" për alokimin e rreshtuar të kornizave korutine.
  • Flamuri "-fstrict-flex-arrays=" zbaton mbështetje për nivelin e tretë të kontrollit të një elementi të vargut fleksibël në struktura (Anëtarët Flexible Array, një grup me madhësi të pacaktuar në fund të strukturës). Në nivelin e tretë, vetëm madhësia "[]" (për shembull, "int b[]") trajtohet si një grup fleksibël, por madhësia "[0]" (për shembull, "int b[0]") nuk eshte.
  • U shtua flamuri "-fmodule-output" për të mundësuar modelin e kompilimit njëfazor për modulet standarde C++.
  • U shtua modaliteti "-Rpass-analysis=stack-frame-layout", i cili lejon diagnostikimin e problemeve me paraqitjen e kornizës së stivës.
  • Një atribut i ri __attribute__((target_version("cpu_features"))) është shtuar dhe funksionaliteti i atributit __attribute__((target_clones("cpu_features1″,"cpu_features2",…))) është zgjeruar për të zgjedhur versione specifike të veçorive të ofruara nga CPU AArch64.
  • Mjete të përmirësuara diagnostikuese:
    • U shtua paralajmërimi "-Wsingle-bit-bit-field-constant-conversion" për të zbuluar shkurtimin e nënkuptuar kur caktoni një në një fushë bit të nënshkruar me një bit.
    • Diagnostifikim i zgjeruar i variablave të painitializuar constexpr.
    • U shtuan paralajmërimet "-Wcast-function-type-strict" dhe "-Wincompatible-function-pointer-types-strict" për të zbuluar problemet e mundshme me transmetimin e llojit të funksionit.
    • Diagnostifikimi i shtuar për përdorimin e emrave të pasaktë ose të rezervuar të moduleve në blloqet e eksportit.
    • Zbulimi i përmirësuar i fjalëve kyçe "auto" që mungojnë në përkufizime.
    • U shtuan kontrolle për situata shtesë të tejmbushjes në zbatimin e paralajmërimit "-Winteger-overflow".
  • Mbështetje e implementuar për arkitekturën e grupit të instruksioneve LoongArch (-march=loongarch64 ose -march=la464) që përdoret në procesorët Loongson 3 5000, i cili zbaton një RISC ISA të ri të ngjashëm me MIPS dhe RISC-V.

Risitë kryesore në LLVM 16.0:

  • Në kodin LLVM, lejohet përdorimi i elementeve të përcaktuara në standardin C++17.
  • Rritja e kërkesave mjedisore për ndërtimin e LLVM. Kompleti i veglave të ndërtimit tani duhet të mbështesë standardin C++17, d.m.th. ndërtimi kërkon të paktën GCC 7.1, Clang 5.0, Apple Clang 10.0 ose Visual Studio 2019 16.7.
  • Mbështetja për CPU-të Cortex-A64, Cortex-X715 dhe Neoverse V3, montuesin RME MEC (Memory Encryption Contexts), shtesat Armv2 (Numri kompleks) dhe Funksioni Multi Versioning është shtuar në bazën e AArch8.3.
  • Backend-i i arkitekturës ARM nuk i mbështet më platformat e synuara Armv2, Armv2A, Armv3 dhe Armv3M, për të cilat gjenerimi i saktë i kodit nuk ishte i garantuar. U shtua aftësia për të gjeneruar kod për udhëzime për të punuar me numra komplekse.
  • Mbështetje e shtuar për arkitekturat e grupeve të instruksioneve (ISA) AMX-FP86, CMPCXADD, AVX-IFMA, AVX-VNNI-INT16, AVX-NE-CONVERT në prapavijën X8. Mbështetje e shtuar për udhëzimet RDMSRLIST, RMSRLIST dhe WRMSRNS. Zbatuar opsionet "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" dhe "-mcpu=grandridge".
  • Mbështetje zyrtare e shtuar për platformën LoongArch.
  • Mbështetja e përmirësuar për arkitekturat MIPS, PowerPC dhe RISC-V
  • Mbështetja për korrigjimin e skedarëve të ekzekutueshëm 64-bit për arkitekturën LoongArch është shtuar në korrigjuesin LLDB. Trajtimi i përmirësuar i simboleve të korrigjimit të COFF. Është siguruar filtrimi i DLL-ve të kopjuara në listën e moduleve të ngarkuara të Windows.
  • Në bibliotekën Libc++, puna kryesore u përqendrua në zbatimin e mbështetjes për veçoritë e reja të standardeve C++20 dhe C++23.
  • Koha e lidhjes është reduktuar ndjeshëm në lidhësin LDD duke paralelizuar skanimin e zhvendosjes së adresave dhe operacionet e inicializimit të seksioneve. Mbështetje e shtuar për kompresimin e seksionit duke përdorur algoritmin ZSTD.

Burimi: opennet.ru

Shto një koment