Lansarea suitei de compilare LLVM 13.0

După șase luni de dezvoltare, a fost prezentată lansarea proiectului LLVM 13.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 în Clang 13.0:

  • S-a implementat suport pentru apelurile de coadă garantate (apelarea unei subrutine la sfârșitul unei funcții, formând o recursivitate de coadă dacă subrutina se autoapelează). Suportul pentru apelurile garantate este oferit de atributul „[[clang::musttail]]” în C++ și „__attribute__((musttail))” în C, folosit într-o declarație „return”. Caracteristica vă permite să implementați optimizări prin implementarea codului într-o iterație plată pentru a economisi consumul de stivă.
  • „utilizarea” declarațiilor și extensiile clang oferă suport pentru definirea atributelor în stil C++11 folosind formatul „[[]]”.
  • S-a adăugat indicatorul „-Wreserved-identifier” pentru a afișa un avertisment atunci când specificați identificatori rezervați în codul utilizatorului.
  • S-au adăugat steaguri „-Wunused-but-set-parameter” și „-Wunused-but-set-variable” pentru a afișa o avertizare dacă un parametru sau o variabilă este setat, dar nu este utilizat.
  • S-a adăugat indicatorul „-Wnull-pointer-subtraction” pentru a emite un avertisment dacă codul ar putea introduce un comportament nedefinit din cauza utilizării unui pointer nul în operațiunile de scădere.
  • S-a adăugat indicatorul „-fstack-usage” pentru a genera pentru fiecare fișier de cod un fișier „.su” suplimentar care conține informații despre dimensiunea cadrelor stivei pentru fiecare funcție definită în fișierul procesat.
  • La analizatorul static a fost adăugat un nou tip de ieșire - „sarif-html”, care duce la generarea de rapoarte simultan în formatele HTML și Sarif. S-a adăugat o nouă verificare allocClassWithName. Când se specifică opțiunea „-analyzer-display-progress”, este afișat timpul de analiză a fiecărei funcții. Analizorul smart pointer (alpha.cplusplus.SmartPtr) este aproape gata.
  • Capacitățile asociate cu suportul OpenCL au fost extinse. S-a adăugat suport pentru noile extensii cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields și __cl_clang_non_portable_kernel_param_types. Implementarea specificației OpenCL 3.0 a continuat. Pentru C, specificația OpenCL 1.2 este utilizată în mod implicit, cu excepția cazului în care este selectată în mod explicit o altă versiune. Pentru C++, a fost adăugat suport pentru fișierele cu extensia „.clcpp”.
  • A fost implementat suportul pentru directivele de transformare a buclei („#pragma omp unrol” și „#pragma omp tile”) definite în specificația OpenMP 5.1.
  • S-au adăugat opțiuni la utilitarul clang-format: SpacesInLineCommentPrefix pentru a defini numărul de spații înainte de comentarii, IndentAccessModifiers, LambdaBodyIndentation și PPIndentWidth pentru a controla alinierea intrărilor, expresiilor lambda și directivelor de preprocesor. Au fost extinse posibilitățile de sortare a enumerarii fișierelor de antet (SortIncludes). S-a adăugat suport pentru formatarea fișierelor JSON.
  • O mare parte de noi cecuri au fost adăugate pentru a fi bine pus la punct.

Inovații cheie în LLVM 13.0:

  • S-a adăugat opțiunea „-ehcontguard” pentru a utiliza tehnologia CET (Windows Control-flow Enforcement Technology) pentru a proteja împotriva execuției exploit-urilor construite folosind tehnici de programare orientată pe returnare (ROP) în etapa de gestionare a excepțiilor.
  • Proiectul debuginfo-test a fost redenumit cross-project-tests și este conceput pentru a testa componente din diferite proiecte, fără a se limita la informațiile de depanare.
  • Sistemul de asamblare oferă suport pentru construirea mai multor distribuții, de exemplu, una cu utilități, iar cealaltă cu biblioteci pentru dezvoltatori.
  • În backend-ul pentru arhitectura AArch64, suportul pentru extensiile Armv9-A RME (Realm Management Extension) și SME (Scalable Matrix Extension) este implementat în asamblator.
  • Suport pentru ISA V68/HVX a fost adăugat la backend pentru arhitectura Hexagon.
  • Backend-ul x86 are suport îmbunătățit pentru procesoarele AMD Zen 3.
  • S-a adăugat suport pentru APU GFX1013 RDNA2 la backend-ul AMDGPU.
  • Libc++ continuă să implementeze noi caracteristici ale standardelor C++20 și C++2b, inclusiv completarea bibliotecii „concepte”. S-a adăugat suport pentru sistemul de fișiere std:: pentru platforma Windows bazată pe MinGW. Fișierele antet separate , Și . S-a adăugat opțiunea de compilare LIBCXX_ENABLE_INCOMPLETE_FEATURES pentru a dezactiva fișierele antet cu funcționalitatea neimplementată complet.
  • Capacitățile linker-ului LLD au fost extinse, în care este implementat suportul pentru procesoarele Big-endian Aarch64, iar backend-ul Mach-O a fost adus într-o stare care permite conectarea programelor obișnuite. Îmbunătățirile incluse necesare pentru a conecta Glibc folosind LLD.
  • Utilitarul llvm-mca (Machine Code Analyzer) a adăugat suport pentru procesoarele care execută instrucțiuni în ordine (conducte superscalare în ordine), cum ar fi ARM Cortex-A55.
  • Depanatorul LLDB pentru platforma AArch64 oferă suport complet pentru registrele Pointer Authentication, MTE (MemTag, Memory Tagging Extension) și SVE. S-au adăugat comenzi care vă permit să legați etichete la fiecare operație de alocare a memoriei și să organizați o verificare a pointerului la accesarea memoriei, care trebuie să fie asociată cu eticheta corectă.
  • Depanatorul LLDB și interfața pentru limbajul Fortran - Flang au fost adăugate la ansamblurile binare generate de proiect.

Sursa: opennet.ru

Adauga un comentariu