Lansarea suitei de compilare LLVM 16.0

După șase luni de dezvoltare, a fost prezentată lansarea proiectului LLVM 16.0 - un set de instrumente compatibil GCC (compilatoare, optimizatoare și generatoare de cod) care comilează programele în coduri de biți intermediare ale instrucțiunilor virtuale asemănătoare RISC (o mașină virtuală de nivel scăzut cu un sistem de optimizare pe mai multe niveluri). Pseudocodul generat poate fi convertit folosind un compilator JIT în instrucțiuni de mașină direct în momentul execuției programului.

Îmbunătățiri majore în Clang 16.0:

  • Standardul C++/ObjC++ implicit este gnu++17 (anterior gnu++14), ceea ce înseamnă că caracteristicile C++17 cu extensii GNU sunt acceptate implicit. Pentru a reveni la comportamentul anterior, puteți utiliza opțiunea „-std=gnu++14”.
  • Funcții avansate implementate legate de standardul C++20:
    • Funcții de membru special triviale condiționat,
    • captarea legăturilor structurate în funcțiile lambda,
    • Operator de egalitate în interiorul expresiilor,
    • Opțiunea de a omite cuvântul cheie typename în unele contexte,
    • Inițializare agregată validă în paranteze („Aggr(val1, val2)”).
  • Caracteristicile definite în viitorul standard C++2b au fost implementate:
    • Este permisă plasarea etichetelor la sfârșitul expresiilor compuse,
    • operator static(),
    • operator static[],
    • Compatibilitatea cu tipul char8_t este asigurată,
    • Gama de caractere permisă pentru utilizare în „\N{...}” a fost extins
    • S-a adăugat posibilitatea de a utiliza variabilele declarate ca „static constexpr” în funcțiile declarate ca constexpr.
  • Caracteristicile definite în viitorul C-standard C2x au fost implementate:
    • Pentru a dezactiva avertismentul „-Wunused-label”, este permis ca atributul „[[maybe_unused]]” să fie aplicat etichetelor
    • Este permisă plasarea etichetelor oriunde în expresiile compuse,
    • S-au adăugat operatori typeof și typeof_unqual,
    • Un nou tip nullptr_t și o constantă nullptr pentru a defini pointerii nuli care se pot converti în orice tip de pointer și reprezintă o variantă de NULL care nu este legată de tipurile întreg și void*.
    • În modul C2x, este permisă apelarea macrocomenzii va_start cu un număr variabil de argumente (variadic).
  • În modurile de conformitate C99, C11 și C17, opțiunile implicite „-Wimplicit-function-declaration” și „-Wimplicit-int” produc acum o eroare în loc de un avertisment.
  • Utilizarea indirectă a „void *” (de exemplu, „void func(void *p) { *p; }”) în modul C++ generează acum o eroare, similară ISO C++, GCC, ICC și MSVC.
  • Specificarea câmpurilor de biți ca operanzi de instrucțiune (de exemplu, „__asm ​​​​{ mov eax, s.bf }”) în blocurile de asamblare inline în stil Microsoft generează acum o eroare.
  • S-au adăugat diagnostice pentru prezența diferitelor structuri și uniuni cu aceleași nume în module diferite.
  • Capacitățile asociate cu suportul OpenCL și OpenMP au fost extinse. Diagnosticare îmbunătățită pentru șabloanele C++ utilizate în argumentele kernel-ului OpenCL. Compatibilitate îmbunătățită a blocului de așteptare pentru AMDGPU. Atributul substantiv vânt este adăugat implicit tuturor funcțiilor. Suport îmbunătățit pentru funcțiile încorporate.
  • S-a adăugat posibilitatea de a utiliza variabila de mediu CLANG_CRASH_DIAGNOSTICS_DIR pentru a defini directorul în care sunt salvate datele de diagnosticare a erorilor.
  • Suportul Unicode a fost actualizat la specificația Unicode 15.0. Unele simboluri matematice sunt permise în identificatori, cum ar fi „₊” (de exemplu, „xₖ₊₁ dublu”).
  • S-a adăugat suport pentru încărcarea mai multor fișiere de configurare (fișierele de configurare implicite sunt încărcate mai întâi, apoi cele specificate prin indicatorul „--config=", care acum poate fi specificat de mai multe ori). Ordinea implicită de încărcare a fișierelor de configurare a fost schimbată: clang încearcă mai întâi să încarce fișierul -.cfg, iar dacă nu este găsit, încearcă să încarce două fișiere .cfg și .cfg. Pentru a dezactiva în mod implicit încărcarea fișierelor de configurare, a fost adăugat indicatorul „--no-default-config”.
  • Pentru a asigura versiuni repetabile, este posibil să înlocuiți valorile curente ale datei și orei din macrocomenzile __DATE__, __TIME__ și __TIMESTAMP__ cu ora specificată în variabila de mediu SOURCE_DATE_EPOCH.
  • Pentru a verifica prezența funcțiilor încorporate (builtin) care pot fi utilizate în contextul constantelor, a fost adăugată macro-ul „__has_constexpr_builtin”.
  • S-a adăugat un nou semnal de compilare „-fcoro-aligned-allocation” pentru alocarea aliniată a cadrelor coroutine.
  • Indicatorul „-fstrict-flex-arrays=" implementează suport pentru al treilea nivel de verificare a elementelor de matrice flexibile din structuri (Flexible Array Members, o matrice de dimensiune nedefinită la sfârșitul structurii). La al treilea nivel, doar dimensiunea „[]” (de exemplu, „int b[]”) este tratată ca o matrice flexibilă, dar dimensiunea „[0]” (de exemplu, „int b[0]”) nu este.
  • S-a adăugat flag „-fmodule-output” pentru a activa modelul de compilare monofazat pentru modulele standard C++.
  • S-a adăugat modul „-Rpass-analysis=stack-frame-layout” pentru a ajuta la diagnosticarea problemelor cu aspectul stivei de cadru.
  • S-a adăugat un nou atribut __attribute__((target_version("cpu_features"))) și s-a extins funcționalitatea atributului __attribute__((target_clones("cpu_features1","cpu_features2",...))) pentru a selecta versiuni specifice ale caracteristicilor furnizate de AArch64 CPU-uri.
  • Instrumente de diagnosticare extinse:
    • S-a adăugat avertismentul „-Wsingle-bit-bitfield-constant-conversion” pentru a detecta trunchierea implicită atunci când se atribuie una unui câmp de biți semnat pe un singur bit.
    • Diagnosticarea variabilelor constexpr neinițializate a fost extinsă.
    • S-au adăugat avertismente „-Wcast-function-type-strict” și „-Wincompatible-function-pointer-types-strict” pentru a identifica potențialele probleme legate de difuzarea tipului de funcție.
    • S-au adăugat diagnostice pentru utilizarea numelor de module incorecte sau rezervate în blocurile de export.
    • Detectare îmbunătățită a cuvintelor cheie „automate” lipsă în definiții.
    • Implementarea avertismentului „-Winteger-overflow” a adăugat verificări pentru situații suplimentare care duc la depășiri.
  • S-a implementat suport pentru arhitectura setului de instrucțiuni LoongArch (-march=loongarch64 sau -march=la464), utilizat în procesoarele Loongson 3 5000 și implementând noul RISC ISA, similar cu MIPS și RISC-V.

Inovații cheie în LLVM 16.0:

  • Codul LLVM este permis să utilizeze elemente definite în standardul C++17.
  • Cerințele de mediu pentru construirea LLVM au fost crescute. Instrumentele de compilare ar trebui să accepte acum standardul C++17, de exemplu. Pentru a construi, aveți nevoie de cel puțin GCC 7.1, Clang 5.0, Apple Clang 10.0 sau Visual Studio 2019 16.7.
  • Backend-ul pentru arhitectura AArch64 adaugă suport pentru procesoarele Cortex-A715, Cortex-X3 și Neoverse V2, asamblator pentru RME MEC (Memory Encryption Contexts), extensii Armv8.3 (Număr complex) și Function Multi Versioning.
  • În backend-ul pentru arhitectura ARM, suportul pentru platformele țintă Armv2, Armv2A, Armv3 și Armv3M a fost întrerupt, pentru care nu a fost garantată generarea codului corect. S-a adăugat capacitatea de a genera cod pentru instrucțiuni de lucru cu numere complexe.
  • Backend-ul pentru arhitectura X86 a adăugat suport pentru arhitecturile setului de instrucțiuni (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. S-a adăugat suport pentru instrucțiunile RDMSRLIST, RMSRLIST și WRMSRNS. Opțiunile implementate „-mcpu=raptorlake”, „-mcpu=meteorlake”, „-mcpu=emeraldrapids”, „-mcpu=sierraforest”, „-mcpu=graniterapids” și „-mcpu=grandridge”.
  • S-a adăugat suport oficial pentru platforma LoongArch.
  • Backend-uri îmbunătățite pentru arhitecturile MIPS, PowerPC și RISC-V
  • S-a adăugat suport pentru depanarea executabilelor pe 64 de biți pentru arhitectura LoongArch la depanatorul LLDB. Gestionarea îmbunătățită a simbolurilor de depanare COFF. Furnizată filtrarea DLL-urilor duplicate în lista modulelor Windows încărcate.
  • În biblioteca Libc++, munca principală s-a concentrat pe implementarea suportului pentru noile caracteristici ale standardelor C++20 și C++23.
  • Linker-ul LDD reduce semnificativ timpul de conectare prin paralelizarea scanării de relocare a adresei și operațiunile de inițializare a secțiunilor. S-a adăugat suport pentru compresia secțiunilor folosind algoritmul ZSTD.

Sursa: opennet.ru

Adauga un comentariu