Lansarea suitei de compilare LLVM 9.0

După șase luni de dezvoltare prezentat lansarea proiectului LLVM 9.0 — Instrumente compatibile cu GCC (compilatoare, optimizatoare și generatoare de cod), compilarea programelor în coduri de biți intermediare ale instrucțiunilor virtuale asemănătoare RISC (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.

Noile caracteristici ale LLVM 9.0 includ eliminarea etichetei de design experimental din platforma țintă RISC-V, suport C++ pentru OpenCL, capacitatea de a împărți un program în părți încărcate dinamic în LLD și implementarea „asm goto", folosit în codul kernel-ului Linux. libc++ a adăugat suport pentru WASI (WebAssembly System Interface), iar LLD a adăugat suport inițial pentru legătura dinamică WebAssembly.

Îmbunătățiri în Clang 9.0:

  • Adăugat implementarea expresiei specifice GCC "asm goto„, care vă permite să treceți de la un bloc inline de asamblare la o etichetă în cod C. Această caracteristică este necesară pentru a construi nucleul Linux în modul „CONFIG_JUMP_LABEL=y” folosind Clang pe sisteme cu arhitectură x86_64. Ținând cont de modificările adăugate în versiunile anterioare, nucleul Linux poate fi acum construit în Clang pentru arhitectura x86_64 (anterior doar construirea pentru arhitecturile arm, aarch64, ppc32, ppc64le și mips era acceptată). Mai mult, proiectele Android și ChromeOS au fost deja convertite pentru a utiliza Clang pentru construirea kernel-ului, iar Google testează Clang ca platformă principală pentru construirea kernel-urilor pentru sistemele Linux de producție. În viitor, alte componente LLVM pot fi utilizate în procesul de construire a nucleului, inclusiv LLD, llvm-objcopy, llvm-ar, llvm-nm și llvm-objdump;
  • S-a adăugat suport experimental pentru utilizarea C++17 în OpenCL. Caracteristicile specifice includ suport pentru atributele spațiului de adresă, blocarea conversiei spațiului de adresă de către operatori de turnare de tip, furnizarea de tipuri de vectori ca în OpenCL pentru C, prezența unor tipuri specifice de OpenCL pentru imagini, evenimente, canale etc.
  • S-au adăugat noi flag-uri de compilator „-ftime-trace” și „-ftime-trace-granularity=N” pentru a genera un raport privind timpul de execuție a diferitelor etape ale frontend-ului (parsare, inițializare) și backend (etape de optimizare). Raportul este salvat în format json, compatibil cu chrome://tracing și speedscope.app;
  • S-a adăugat procesarea specificatorului „__declspec(allocator)” și generarea de informații de depanare însoțitoare care vă permit să monitorizați consumul de memorie în mediul Visual Studio;
  • Pentru limbajul C, a fost adăugat suport pentru macrocomanda „__FILE_NAME__”, care seamănă cu macrocomanda „__FILE__”, dar include doar numele fișierului fără calea completă;
  • C++ a extins suportul pentru atributele spațiului de adrese pentru a acoperi diverse caracteristici C++, inclusiv modele de parametri și argumente, tipuri de referință, inferență de tip returnat, obiecte, funcții generate automat, operatori încorporați și multe altele.
  • Capacitățile asociate cu suportul pentru OpenCL, OpenMP și CUDA au fost extinse. Aceasta include suport inițial pentru includerea implicită a funcțiilor OpenCL încorporate (a fost adăugat flag „-fdeclare-opencl-builtins”), extensia cl_arm_integer_dot_product a fost implementată și instrumentele de diagnosticare au fost extinse;
  • Activitatea analizorului static a fost îmbunătățită și a fost adăugată documentația privind efectuarea analizei statice. S-au adăugat steaguri pentru a afișa modulele de verificare disponibile și opțiunile acceptate („-analyzer-checker[-opțiune]-help”, „-analyzer-checker[-option]-help-alpha” și „-analyzer-checker[-opțiune]-help " -dezvoltator"). S-a adăugat indicatorul „-analyzer-werror” pentru a trata avertismentele ca erori.
    S-au adăugat noi moduri de verificare:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling pentru a identifica practicile nesigure pentru lucrul cu tampon;
    • osx.MIGChecker pentru a căuta încălcări ale regulilor de apel MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast pentru a găsi conversii incorecte de obiect XNU libkern;
    • apiModeling.llvm cu un set de funcții de verificare a modelării pentru a detecta erori în baza de cod LLVM;
    • Cod stabilizat pentru verificarea obiectelor C++ neinițializate (UninitializedObject în pachetul optin.cplusplus);
  • Utilitarul clang-format a adăugat suport pentru formatarea codului în limbajul C# și oferă suport pentru stilul de formatare a codului utilizat de Microsoft;
  • clang-cl, o interfață alternativă de linie de comandă care oferă compatibilitate la nivel de opțiune cu compilatorul cl.exe inclus în Visual Studio, a adăugat euristici pentru a trata fișierele inexistente ca opțiuni de linie de comandă și pentru a afișa un avertisment corespunzător (de exemplu, când rulează „clang-cl /diagnostic :caret /c test.cc”);
  • O mare parte de verificări noi au fost adăugate la linter clang-tidy, inclusiv verificări adăugate specifice API-ului OpenMP;
  • Extins capabilitățile serverului clangd (Clang Server), în care modul de construire a indexului de fundal este activat în mod implicit, a fost adăugat suport pentru acțiuni contextuale cu cod (recuperare variabile, extinderea definițiilor automate și macro, conversia șirurilor cu evadare în șiruri fără escape), capacitatea de a afișa avertismente de la Clang-tidy, diagnosticare extinsă a erorilor în fișierele antet și a adăugat capacitatea de a afișa informații despre ierarhia tipurilor;

Principalul inovații LLVM 9.0:

  • La linkerul LLD a fost adăugată o caracteristică experimentală de partiționare, care vă permite să împărțiți un program în mai multe părți, fiecare dintre acestea fiind localizată într-un fișier ELF separat. Această caracteristică vă permite să lansați partea principală a programului, care va încărca alte componente după cum este necesar în timpul funcționării (de exemplu, puteți separa vizualizatorul PDF încorporat într-un fișier separat, care se va încărca numai când utilizatorul deschide PDF-ul fişier).

    LLD Linker adusă în prim-plan la o stare potrivită pentru conectarea nucleului Linux pentru arhitecturile arm32_7, arm64, ppc64le și x86_64.
    Opțiuni noi „-” (ieșire la stdout), „-[no-]allow-shlib-undefined”, „-undefined-glob”, „-nmagic”, „-omagic”, „-dependent-library”, „- z ifunc-noplt" și "-z common-page-size". Pentru arhitectura AArch64, a fost adăugat suport pentru instrucțiunile BTI (Branch Target Indicator) și PAC (Pointer Authentication Code). Suportul pentru platformele MIPS, RISC-V și PowerPC a fost îmbunătățit semnificativ. S-a adăugat suport inițial pentru legătura dinamică pentru WebAssembly;

  • În libc++ implementate funcțiile ssize, std::is_constant_evaluated, std::midpoint și std::lerp, metodele „front” și „back” au fost adăugate la std::span, atributele de tipuri std::is_unbounded_array și std::is_bounded_array au fost adăugate , capabilitățile std au fost extinse: :atomic. Suportul pentru GCC 4.9 a fost întrerupt (poate fi utilizat cu GCC 5.1 și versiunile mai noi). Sprijin adăugat AM FOST (WebAssembly System Interface, o interfață pentru utilizarea WebAssembly în afara browserului);
  • Au fost adăugate noi optimizări. S-a activat conversia apelurilor memcmp în bcmp în unele situații. S-a implementat verificarea intervalului de sărituri pentru tabele de salt în care blocurile de comutatoare inferioare nu sunt accesibile sau când instrucțiunile nu sunt utilizate, de exemplu, la apelarea funcțiilor cu tipul void;
  • Backend-ul pentru arhitectura RISC-V a fost stabilizat, care nu mai este poziționat ca experimental și este construit implicit. Oferă suport complet pentru generarea de cod pentru variantele setului de instrucțiuni RV32I și RV64I cu extensii MAFDC;
  • Au fost aduse numeroase îmbunătățiri backend-urilor pentru arhitecturile X86, AArch64, ARM, SystemZ, MIPS, AMDGPU și PowerPC. De exemplu, pentru arhitectură
    AArch64 a adăugat suport pentru instrucțiunile SVE2 (Scalable Vector Extension 2) și MTE (Memory Tagging Extensions); în backend-ul ARM, a fost adăugat suport pentru arhitectura Armv8.1-M și extensia MVE (M-Profile Vector Extension). Suportul pentru arhitectura GFX10 (Navi) a fost adăugat la backend-ul AMDGPU, capabilitățile de apelare a funcțiilor sunt activate în mod implicit și o trecere combinată este activată DPP (Date-Primitive paralele).

  • Depanatorul LLDB are acum evidențierea culorilor pentru backtraces și a adăugat suport pentru blocurile DWARF4 debug_types și DWARF5 debug_info;
  • Suport pentru fișiere obiect și executabile în format COFF a fost adăugat la utilitarele llvm-objcopy și llvm-strip.

Sursa: opennet.ru

Adauga un comentariu