Lansarea suitei de compilare LLVM 22

După șase luni de dezvoltare, a fost lansată LLVM 22.1.0. Aceasta dezvoltă instrumente (compilatoare, optimizatoare și generatoare de cod) care compilează programe în cod biți intermediar al instrucțiunilor virtuale de tip RISC (o mașină virtuală de nivel scăzut cu un sistem de optimizare pe mai multe niveluri). Pseudocod-ul generat poate fi convertit în cod mașină pentru o anumită platformă țintă sau utilizat de un compilator just-in-time (JIT) pentru a genera instrucțiuni mașină direct în timpul execuției programului. Bazat pe tehnologiile LLVM, proiectul dezvoltă compilatorul Clang, care suportă limbajele de programare C, C++ și Objective-C. Începând cu ramura 18.x, proiectul a trecut la o nouă schemă de numerotare a versiunilor, conform căreia versiunea 0 („N.0”) este utilizată în timpul dezvoltării, iar prima versiune stabilă este numerotată „N.1”.

Printre îmbunătățirile din Clang 22:

  • S-a adăugat suport pentru token-uri de alocare a memoriei (Allocation Tokens) pentru marcarea operațiunilor de alocare a memoriei efectuate folosind funcții precum malloc cu un identificator unic. Token-urile de alocare permit structurarea informațiilor din heap, simplificarea detectării scurgerilor de memorie și activarea grupării obiectelor în funcție de scopul sau modelele lor de modificare (de exemplu, separarea datelor „calde” de cele „reci”). Pentru activare, utilizați indicatorul „-fsanitize=alloc-token”.
  • Caracteristici legate de limbajul C:
    • A fost implementată o specificație preliminară care definește mecanismul de execuție amânată „defer”, permițând executarea acțiunilor atunci când domeniul de aplicare curent se încheie. A fost adăugat indicatorul „-fdefer-ts” pentru a activa suportul pentru „defer”.
    • Funcția încorporată __builtin_stack_address() a fost adăugată, oglindind funcția similară din GCC. Această funcție returnează adresa stivei, separând zona stivei a funcției curente care a apelat __builtin_stack_address() și funcțiile ulterioare pe care le apelează.
  • Capacități dezvoltate pentru viitorul standard C2y:
    • A fost adăugat suport pentru bucle denumite, care vă permite să atribuiți nume buclelor și instrucțiunilor switch, care pot fi specificate în instrucțiunile break și continue pentru a defini explicit bucla din care se va ieși. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // mergeți la CONT1 continue outer; // mergeți la CONT2 // CONT1 } // CONT2 }
    • Implementarea macrocomenzii încorporate „__COUNTER__”, concepută pentru a genera nume unice de identificatori, a fost extinsă și inclusă în standard. A fost setată o limită de 2147483647 de apeluri către această macrocomandă; depășirea acestei limite va genera o eroare.
    • A fost eliminat avertismentul (-Wstatic-in-inline) la utilizarea funcțiilor statice sau a variabilelor în cadrul funcțiilor declarate ca „extern inline”.
  • Capacități definite în standardul C23 C:
    • Fișierul antet float.h acceptă acum macrocomenzile FLT_SNAN, DBL_SNAN și LDBL_SNAN, care implementează valori NaN semnalizate (care provoacă o excepție atunci când sunt utilizate în operații aritmetice) pentru tipurile float, double și long double.
    • S-a remediat o eroare din cauza căreia diferite tipuri fără nume erau tratate ca compatibile în cadrul aceleiași unități de traducere dacă aveau aceleași câmpuri.
    • Indicatorul „-MG” folosit pentru a ignora fișierele antet lipsă în timpul scanării dependențelor a fost extins la directivele „#embed” și acum suprimă eroarea „fișier negăsit” atunci când lipsește un fișier specificat într-o directivă „#embed”.
  • Caracteristici legate de C++:
    • A fost adăugată posibilitatea de a utiliza legături structurate în contextul „constexpr”, așa cum a fost dezvoltată în specificația C++2c (C++26). Aceasta înseamnă că referințele la expresii constante pot fi acum ele însele expresii constante. Este implementat suport pentru tablouri și structuri simple (tuplurile nu sunt încă suportate). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • Conform cerințelor standardului C++20, constrângerile sunt acum convertite în formă standard înainte de a fi verificate, permițând mesaje de diagnosticare mai precise și gestionarea corectă a erorilor de substituție din argumentele șablon utilizate doar în ID-urile de concept.
    • A fost adăugată o familie de funcții încorporate „__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship” pentru a afla dacă operatorii de comparație „<”, „>”, „<=" și „>=" au fost sintetizați din operatorul „<=>”.
    • Parametrul „-Wincompatible-pointer-types” a fost modificat pentru a afișa o eroare în loc de un avertisment. Pentru a reveni la comportamentul anterior, utilizați opțiunea „-Wno-error=incompatible-pointer-types”.
  • Au fost adăugate funcțiile încorporate __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter și __builtin_dedup_pack. De exemplu, builtin_dedup_pack vă permite să eliminați duplicatele dintr-o listă de tipuri: folosind MyTypeList = TypeList<__builtin_dedup_pack …>; // tipul rezultat va fi TypeList
  • La depanarea comportamentului nedefinit cu UBSan (-fsanitize=undefined -fsanitize-trap=undefined), informațiile despre cauza erorii sunt acum incluse în informațiile de depanare generate. A fost adăugat indicatorul „-fsanitize-debug-trap-reasons” pentru a specifica nivelul de detaliu al informațiilor despre eroare. Acesta poate fi setat la „de bază” pentru descrieri generale (de exemplu, „Adunarea de întregi a depășit valoarea”) și la „detaliat” pentru a include informații detaliate (de exemplu, „adunarea de întregi cu semn a depășit valoarea în 'a + b'”).
  • S-au adăugat noi steaguri de compilator:
    • „-f[no-]sanitize-debug-trap-reasons” pentru a controla dacă motivele pentru excepții sunt încorporate în informațiile de depanare la compilarea cu modul „-fsanitize-trap”.
    • „-fsanitize=alloc-token”, „-falloc-token-max”, „-fsanitize-alloc-token-fast-abi” și „-fsanitize-alloc-token-extended” pentru a gestiona token-urile de alocare a memoriei.
    • „-fmatrix-memory-layout” pentru a controla structura memoriei tipurilor de matrice (de exemplu, column-major pentru column-major, row-major pentru row-major).
  • Funcțiile au acum un atribut „malloc_span”, similar cu atributul malloc, dar aplicabil funcțiilor care returnează structuri de tip span care conțin un pointer și un câmp cu dimensiunea sau un pointer către sfârșitul blocului.
  • A fost adăugat atributul „modular_format” pentru a selecta dinamic implementarea legată static necesară a funcției printf în momentul legăturii.
  • Instrumentele de diagnosticare și analiză statică au fost extinse, au fost adăugate noi verificări (câteva zeci de îmbunătățiri legate de diagnosticare).
  • În backend-ul X86 au fost adăugate caracteristici intrinseci suplimentare pentru extensiile SSE, AVX și AVX512. Au fost adăugate moduri de compilare pentru procesoarele Intel bazate pe microarhitecturile Wildcat Lake (-march=wildcatlake) și Nova Lake (-march=novalake).
  • Backend-ul AArch64 acceptă acum procesoarele Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) și Arm C1-Ultra (c1-ultra). Au fost adăugate funcții încorporate suplimentare pentru instrucțiunile FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] și FCVTA[US]. Suportul pentru Function Multi-Versioning (FMV) a fost stabilizat. Utilizatorii pot acum suprascrie prioritatea diferitelor versiuni de funcții.
  • Adăugat suport pentru arhitectura LoongArch32 (LA32R, LA32S).
  • Backend-uri îmbunătățite pentru arhitecturile ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly și PowerPC.

Sursa: opennet.ru

Cumpărați găzduire de încredere pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără găzduire web fiabilă cu protecție DDoS, servere VPS VDS | ProHoster