Llançament del conjunt de compiladors LLVM 12.0

Després de sis mesos de desenvolupament, es va presentar el llançament del projecte LLVM 12.0: un conjunt d'eines compatible amb GCC (compiladors, optimitzadors i generadors de codi) que compila programes en codi de bits intermedi d'instruccions virtuals semblants a RISC (una màquina virtual de baix nivell amb un sistema d'optimització multinivell). El pseudocodi generat es pot convertir mitjançant un compilador JIT en instruccions de màquina directament en el moment de l'execució del programa.

Millores a Clang 12.0:

  • S'ha implementat i habilitat per defecte el suport per als atributs "probable" i "improbable" proposats a l'estàndard C++20, la qual cosa permet que l'optimitzador estigui informat sobre la probabilitat que s'activi el constructe condicional (per exemple, "[[probablement") ]] si (aleatori > 0) {“).
  • S'ha afegit suport per als processadors AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) i Intel Sapphire Rapids (-march=sapphirerapids).
  • S'ha afegit suport per a les marques "-march=x86-64-v[234]" per seleccionar els nivells d'arquitectura x86-64 (v2 - cobreix les extensions SSE4.2, SSSE3, POPCNT i CMPXCHG16B; v3 - AVX2 i MOVBE; v4 - AVX-512 ).
  • S'ha afegit suport per als processadors Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) i Fujitsu A64FX (a64fx). Per exemple, per habilitar optimitzacions per a les CPU Neoverse-V1, podeu especificar "-mcpu=neoverse-v1".
  • Per a l'arquitectura AArch64, s'han afegit noves marques del compilador "-moutline-atomics" i "-mno-outline-atomics" per habilitar o desactivar les funcions d'ajuda d'operacions atòmiques, com ara "__aarch64_cas8_relax". Aquestes funcions detecten en temps d'execució si el suport de LSE (Extensions de sistema grans) està disponible i utilitzen les instruccions del processador atòmic proporcionades o tornen a utilitzar instruccions LL/SC (Load-link/store-conditional) per a la sincronització.
  • S'ha afegit l'opció "-fbinutils-version" per seleccionar la versió de destinació de la suite binutils per a la compatibilitat amb l'enllaçador i el comportament de l'assemblador més antics.
  • Per als fitxers executables ELF, quan s'especifica el senyalador "-gz", la compressió de la informació de depuració mitjançant la biblioteca zlib està activada per defecte (gz=zlib). Enllaçar els fitxers d'objecte resultants requereix lld o GNU binutils 2.26+. Per restaurar la compatibilitat amb versions anteriors de binutils, podeu especificar "-gz=zlib-gnu".
  • El punter "aquest" ara es processa amb comprovacions no nuls i desreferenciables (N). Per eliminar l'atribut no null quan necessiteu utilitzar valors NULL, podeu utilitzar l'opció "-fdelete-null-pointer-checks".
  • A la plataforma Linux, el mode "-fasynchronous-unwind-tables" està habilitat per a les arquitectures AArch64 i PowerPC per generar taules de trucades de relaxació, com a GCC.
  • A "#pragma clang loop vectorize_width" s'ha afegit la possibilitat d'especificar les opcions "fixa" (per defecte) i "escalable" per seleccionar el mètode de vectorització. El mode "escalable", independent de la longitud del vector, és experimental i es pot utilitzar en maquinari que admet la vectorització escalable.
  • Suport millorat per a la plataforma Windows: s'han preparat assemblatges binaris oficials per a Windows als sistemes Arm64, incloent el compilador Clang, l'enllaç LLD i les biblioteques de temps d'execució del compilador-rt. Quan es construeix per a plataformes de destinació MinGW, s'afegeix el sufix .exe, fins i tot quan es fa una compilació creuada.
  • S'han ampliat les capacitats associades al suport per a OpenCL, OpenMP i CUDA. S'han afegit opcions "-cl-std=CL3.0" i "-cl-std=CL1.0" per seleccionar opcions de macro per a OpenCL 3.0 i OpenCL 1.0. S'han ampliat les eines de diagnòstic.
  • S'ha afegit suport per a les instruccions HRESET, UINTR i AVXVNNI implementades en alguns processadors basats en x86.
  • En sistemes x86, el suport per a l'opció "-mtune=" està habilitat ", que activa les optimitzacions microarquitectòniques seleccionades, independentment del valor de "-march= "
  • L'analitzador estàtic ha millorat el processament d'algunes funcions POSIX i ha millorat significativament la determinació del resultat d'operacions condicionals quan hi ha diversos valors simbòlics en la comparació. S'han afegit noves comprovacions: fuchia.HandleChecker (defineix identificadors en estructures), webkit.UncountedLambdaCapturesChecker webkit i alpha.webkit.UncountedLocalVarsChecker (té en compte les peculiaritats de treballar amb punters en el codi del motor de WebKit).
  • En expressions utilitzades en el context de constants, l'ús de les funcions integrades __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bsfq, _bsfq, _bsr, _bsr, _bsr wap, __bswapd, __bswap64, __ està permès bswapq , _castf*, __rol* i __ror*.
  • S'ha afegit una opció BitFieldColonSpacing a la utilitat Clang-format per seleccionar l'espai entre identificadors, columnes i definicions de camp.
  • El servidor de memòria cau clangd (Clang Server) a la plataforma Linux ha reduït significativament el consum de memòria durant el funcionament a llarg termini (es proporcionen trucades periòdiques a malloc_trim per retornar pàgines de memòria lliures al sistema operatiu).

Innovacions clau en LLVM 12.0:

  • El suport per a l'eina de compilació llvm-build escrita en Python s'ha interromput i, en canvi, el projecte ha canviat completament a utilitzar el sistema de compilació CMake.
  • En el backend per a l'arquitectura AArch64, s'ha millorat el suport per a la plataforma Windows: s'ha assegurat la generació correcta de la sortida de l'assemblador per als sistemes Windows objectiu, s'ha optimitzat la generació de dades sobre les trucades de relaxació (la mida d'aquestes dades s'ha reduït en 60 %), s'han afegit les directives .seh_* la possibilitat de crear dades de desenrotllament mitjançant l'assemblador.
  • El backend per a l'arquitectura PowerPC inclou noves optimitzacions per a bucles i desplegament en línia, suport ampliat per als processadors Power10, suport afegit per a instruccions MMA per a la manipulació de matrius i suport millorat per al sistema operatiu AIX.
  • El backend x86 afegeix suport per als processadors AMD Zen 3, Intel Alder Lake i Intel Sapphire Rapids, així com les instruccions del processador HRESET, UINTR i AVXVNNI. Suport per a MPX (extensions de protecció de memòria) per comprovar els punters per assegurar-se que els límits de memòria ja no són compatibles (aquesta tecnologia no està molt estesa i ja s'ha eliminat de GCC i clang). S'ha afegit suport a l'assemblador per als prefixos {disp32} i {disp8} i els sufixos .d32 i .d8 per controlar la mida dels desplaçaments i salts d'operands. S'ha afegit un nou atribut "tune-cpu" per controlar la inclusió d'optimitzacions de microarquitectura.
  • S'ha afegit un nou mode "-fsanitize=unsigned-shift-base" al detector de problemes d'enters (desinfectador d'entiers, "-fsanitize=integer") per detectar desbordaments de nombres enters sense signe després d'un canvi de bit cap a l'esquerra.
  • En diversos detectors (asan, cfi, lsan, msan, tsan, ubsan sanitizer) s'ha afegit suport per a distribucions de Linux amb la biblioteca estàndard de Musl.
  • S'han ampliat les capacitats de l'enllaç LLD. Suport millorat per al format ELF, incloses les opcions afegides "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program". -visibilitat" " Suport MinGW millorat. Per al format Mach-O (macOS), s'ha implementat suport per a arquitectures arm64, arm i i386, optimitzacions de temps d'enllaç (LTO) i desenrotllament de pila per al maneig d'excepcions.
  • Libc++ implementa noves característiques de l'estàndard C++20 i ha començat el desenvolupament de característiques de l'especificació C++2b. S'ha afegit suport per a la creació amb desactivació del suport de localització ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") i dispositius per generar números pseudoaleatoris ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF").

Font: opennet.ru

Afegeix comentari