Lansarea suitei de compilare LLVM 12.0

După șase luni de dezvoltare, a fost prezentată lansarea proiectului LLVM 12.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 12.0:

  • Suportul pentru atributele „probabil” și „improbabil” propuse în standardul C++20 a fost implementat și activat în mod implicit, permițând optimizatorului să fie informat despre probabilitatea declanșării constructului condiționat (de exemplu, „[[probabil ]] dacă (aleatoriu > 0) {“).
  • S-a adăugat suport pentru procesoarele AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) și Intel Sapphire Rapids (-march=sapphirerapids).
  • S-a adăugat suport pentru semnalizatoarele „-march=x86-64-v[234]” pentru a selecta nivelurile de arhitectură x86-64 (v2 - acoperă extensiile SSE4.2, SSSE3, POPCNT și CMPXCHG16B; v3 - AVX2 și MOVBE; v4 - AVX-512 ).
  • S-a adăugat suport pentru procesoarele Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) și Fujitsu A64FX (a64fx). De exemplu, pentru a activa optimizările pentru procesoarele Neoverse-V1, puteți specifica „-mcpu=neoverse-v1”.
  • Pentru arhitectura AArch64, au fost adăugate noi steguri de compilator „-moutline-atomics” și „-mno-outline-atomics” pentru a activa sau dezactiva funcțiile de ajutor pentru operarea atomică, cum ar fi „__aarch64_cas8_relax”. Astfel de funcții detectează în timpul execuției dacă suportul LSE (Extensii de sistem mari) este disponibil și utilizează instrucțiunile furnizate de procesor atomic sau se retrag la utilizarea instrucțiunilor LL/SC (Load-link/store-conditional) pentru sincronizare.
  • S-a adăugat opțiunea „-fbinutils-version” pentru a selecta versiunea țintă a suitei binutils pentru compatibilitate cu comportamentul mai vechi de linker și asamblare.
  • Pentru fișierele executabile ELF, când este specificat indicatorul „-gz”, compresia informațiilor de depanare folosind biblioteca zlib este activată în mod implicit (gz=zlib). Conectarea fișierelor obiect rezultate necesită lld sau GNU binutils 2.26+. Pentru a restabili compatibilitatea cu versiunile mai vechi de binutils, puteți specifica „-gz=zlib-gnu”.
  • Pointerul „acest” este acum procesat cu verificări non-null și dereferenceable(N). Pentru a elimina atributul nonnull atunci când trebuie să utilizați valori NULL, puteți utiliza opțiunea „-fdelete-null-pointer-checks”.
  • Pe platforma Linux, modul „-fasynchronous-unwind-tables” este activat pentru arhitecturile AArch64 și PowerPC pentru a genera tabele de apel de derulare, ca în GCC.
  • În „#pragma clang loop vectorize_width” s-a adăugat posibilitatea de a specifica opțiunile „fix” (implicit) și „scalabile” pentru a selecta metoda de vectorizare. Modul „scalabil”, independent de lungimea vectorului, este experimental și poate fi utilizat pe hardware care acceptă vectorizarea scalabilă.
  • Suport îmbunătățit pentru platforma Windows: au fost pregătite ansambluri binare oficiale pentru Windows pe sistemele Arm64, inclusiv compilatorul Clang, linkerul LLD și bibliotecile de execuție compilator-rt. La construirea pentru platformele țintă MinGW, se adaugă sufixul .exe, chiar și la compilare încrucișată.
  • Capacitățile asociate cu suportul pentru OpenCL, OpenMP și CUDA au fost extinse. S-au adăugat opțiunile „-cl-std=CL3.0” și „-cl-std=CL1.0” pentru a selecta opțiunile macro pentru OpenCL 3.0 și OpenCL 1.0. Instrumentele de diagnosticare au fost extinse.
  • S-a adăugat suport pentru instrucțiunile HRESET, UINTR și AVXVNNI implementate în unele procesoare bazate pe x86.
  • Pe sistemele x86, suportul pentru opțiunea „-mtune=” este activat, permițând optimizările microarhitecturale selectate, indiferent de valoarea „-march=”.
  • Analizorul static a îmbunătățit procesarea unor funcții POSIX și a îmbunătățit semnificativ determinarea rezultatului operațiilor condiționate atunci când există mai multe valori simbolice în comparație. Au fost adăugate noi verificări: fuchia.HandleChecker (definește mânerele în structuri), webkit.UncountedLambdaCapturesChecker webkit și alpha.webkit.UncountedLocalVarsChecker (ține cont de particularitățile lucrului cu pointeri în codul motorului WebKit).
  • În expresiile folosite în contextul constantelor, utilizarea funcțiilor încorporate __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bsfq, __bsfq, __bsr, _bsr, __bsr wap, __bswapd, __bswap64, __ este permis bswapq , _castf*, __rol* și __ror*.
  • S-a adăugat o opțiune BitFieldColonSpacing la utilitarul clang-format pentru a selecta spațierea în jurul identificatorilor, coloanelor și definițiilor câmpurilor.
  • Serverul de cache clangd (Clang Server) de pe platforma Linux a redus semnificativ consumul de memorie în timpul funcționării pe termen lung (apelurile periodice către malloc_trim sunt furnizate pentru a returna paginile de memorie libere către sistemul de operare).

Inovații cheie în LLVM 12.0:

  • Suportul pentru instrumentul de compilare llvm-build scris în Python a fost întrerupt și, în schimb, proiectul a trecut complet la utilizarea sistemului de compilare CMake.
  • În backend-ul pentru arhitectura AArch64, suportul pentru platforma Windows a fost îmbunătățit: a fost asigurată generarea corectă a ieșirii de asamblare pentru sistemele Windows țintă, a fost optimizată generarea de date privind apelurile de derulare (dimensiunea acestor date a fost redusă cu 60). %), capacitatea de a crea date de desfășurare folosind assembler a fost adăugată directivelor .seh_*.
  • Backend-ul pentru arhitectura PowerPC oferă noi optimizări pentru bucle și implementare inline, suport extins pentru procesoarele Power10, suport adăugat pentru instrucțiuni MMA pentru manipularea matricei și suport îmbunătățit pentru sistemul de operare AIX.
  • Backend-ul x86 adaugă suport pentru procesoarele AMD Zen 3, Intel Alder Lake și Intel Sapphire Rapids, precum și instrucțiunile procesoarelor HRESET, UINTR și AVXVNNI. Suport pentru MPX (Extensii de protecție a memoriei) pentru verificarea indicatorilor pentru a se asigura că limitele de memorie nu mai sunt acceptate (această tehnologie nu este răspândită și a fost deja eliminată din GCC și clang). S-a adăugat suport pentru asamblare pentru prefixele {disp32} și {disp8} și sufixele .d32 și .d8 pentru a controla dimensiunea decalajelor și salturilor operanzilor. S-a adăugat un nou atribut „tune-cpu” pentru a controla includerea optimizărilor microarhitecturale.
  • Un nou mod „-fsanitize=unsigned-shift-base” a fost adăugat la detectorul de probleme întregi (dezinfectant întreg, „-fsanitize=integer”) pentru a detecta depășirile de numere întregi fără semn după o schimbare de biți la stânga.
  • În diverse detectoare (asan, cfi, lsan, msan, tsan, ubsan sanitizer) a fost adăugat suport pentru distribuțiile Linux cu biblioteca standard Musl.
  • Capacitățile linkerului LLD au fost extinse. Suport îmbunătățit pentru formatul ELF, inclusiv opțiunile adăugate „--dependency-file”, „-error-handling-script”, „-lto-pseudo-probe-for-profiling”, „-no-lto-tot-program - vizibilitate” Suport îmbunătățit MinGW. Pentru formatul Mach-O (macOS), a fost implementat suport pentru arhitecturile arm64, arm și i386, optimizarea timpului de legătură (LTO) și derularea stivei pentru gestionarea excepțiilor.
  • Libc++ implementează noi caracteristici ale standardului C++20 și a început dezvoltarea caracteristicilor specificației C++2b. S-a adăugat suport pentru crearea cu dezactivarea suportului de localizare (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) și dispozitive pentru generarea de numere pseudoaleatoare (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Sursa: opennet.ru

Adauga un comentariu