Lanzamiento del conjunto de compiladores LLVM 12.0

Después de seis meses de desarrollo, se presentó el lanzamiento del proyecto LLVM 12.0: un conjunto de herramientas compatible con GCC (compiladores, optimizadores y generadores de código) que compila programas en códigos de bits intermedios de instrucciones virtuales tipo RISC (una máquina virtual de bajo nivel con sistema de optimización multinivel). El pseudocódigo generado se puede convertir mediante un compilador JIT en instrucciones de máquina directamente en el momento de la ejecución del programa.

Mejoras en Clang 12.0:

  • Se ha implementado y habilitado de forma predeterminada la compatibilidad con los atributos "probable" e "improbable" propuestos en el estándar C++ 20, lo que permite informar al optimizador sobre la probabilidad de que se active la construcción condicional (por ejemplo, "[[probable ]] si (aleatorio > 0) {“).
  • Se agregó soporte para los procesadores AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) e Intel Sapphire Rapids (-march=sapphirerapids).
  • Se agregó soporte para los indicadores "-march=x86-64-v[234]" para seleccionar niveles de arquitectura x86-64 (v2: cubre las extensiones SSE4.2, SSSE3, POPCNT y CMPXCHG16B; v3: AVX2 y MOVBE; v4: AVX-512 ).
  • Se agregó soporte para los procesadores Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) y Fujitsu A64FX (a64fx). Por ejemplo, para habilitar optimizaciones para CPU Neoverse-V1, puede especificar "-mcpu=neoverse-v1".
  • Para la arquitectura AArch64, se han agregado nuevos indicadores del compilador "-moutline-atomics" y "-mno-outline-atomics" para habilitar o deshabilitar funciones auxiliares de operaciones atómicas, como "__aarch64_cas8_relax". Dichas funciones detectan en tiempo de ejecución si la compatibilidad con LSE (Extensiones de sistemas grandes) está disponible y utilizan las instrucciones del procesador atómico proporcionadas o recurren al uso de instrucciones LL/SC (enlace de carga/condicional de almacenamiento) para la sincronización.
  • Se agregó la opción "-fbinutils-version" para seleccionar la versión de destino del conjunto binutils para compatibilidad con el comportamiento anterior del enlazador y ensamblador.
  • Para archivos ejecutables ELF, cuando se especifica el indicador "-gz", la compresión de la información de depuración utilizando la biblioteca zlib está habilitada de forma predeterminada (gz=zlib). Para vincular los archivos de objetos resultantes se requiere lld o GNU binutils 2.26+. Para restaurar la compatibilidad con versiones anteriores de binutils, puede especificar "-gz=zlib-gnu".
  • El puntero 'este' ahora se procesa con comprobaciones no nulas y desreferenciables (N). Para eliminar el atributo no nulo cuando necesita usar valores NULL, puede usar la opción "-fdelete-null-pointer-checks".
  • En la plataforma Linux, el modo "-fasynchronous-unwind-tables" está habilitado para las arquitecturas AArch64 y PowerPC para generar tablas de llamadas de desenredado, como en GCC.
  • En "#pragma clang loop vectorize_width" se agregó la capacidad de especificar las opciones "fija" (predeterminada) y "escalable" para seleccionar el método de vectorización. El modo "escalable", independiente de la longitud del vector, es experimental y puede usarse en hardware que admita la vectorización escalable.
  • Soporte mejorado para la plataforma Windows: se han preparado ensamblajes binarios oficiales para Windows en sistemas Arm64, incluido el compilador Clang, el vinculador LLD y las bibliotecas de tiempo de ejecución del compilador-rt. Al compilar para plataformas de destino MinGW, se agrega el sufijo .exe, incluso durante la compilación cruzada.
  • Se han ampliado las capacidades asociadas con el soporte para OpenCL, OpenMP y CUDA. Se agregaron opciones "-cl-std=CL3.0" y "-cl-std=CL1.0" para seleccionar opciones de macro para OpenCL 3.0 y OpenCL 1.0. Se han ampliado las herramientas de diagnóstico.
  • Se agregó soporte para las instrucciones HRESET, UINTR y AVXVNNI implementadas en algunos procesadores basados ​​en x86.
  • En sistemas x86, la compatibilidad con la opción "-mtune=" está habilitada ", que activa las optimizaciones de microarquitectura seleccionadas, independientemente del valor de "-march= "
  • El analizador estático ha mejorado el procesamiento de algunas funciones POSIX y ha mejorado significativamente la determinación del resultado de las operaciones condicionales cuando hay varios valores simbólicos en la comparación. Se han agregado nuevas comprobaciones: fuchia.HandleChecker (define identificadores en estructuras), webkit.UncountedLambdaCapturesChecker webkit y alpha.webkit.UncountedLocalVarsChecker (tiene en cuenta las peculiaridades de trabajar con punteros en el código del motor WebKit).
  • En expresiones utilizadas en el contexto de constantes, se permite el uso de funciones integradas __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64. __bswapq , _castf*, __rol* y __ror*.
  • Se agregó una opción BitFieldColonSpacing a la utilidad clang-format para seleccionar el espaciado alrededor de identificadores, columnas y definiciones de campos.
  • El servidor de almacenamiento en caché clangd (Clang Server) en la plataforma Linux ha reducido significativamente el consumo de memoria durante el funcionamiento a largo plazo (se proporcionan llamadas periódicas a malloc_trim para devolver páginas de memoria libres al sistema operativo).

Innovaciones clave en LLVM 12.0:

  • Se suspendió la compatibilidad con la herramienta de compilación llvm-build escrita en Python y, en su lugar, el proyecto pasó por completo a utilizar el sistema de compilación CMake.
  • En el backend de la arquitectura AArch64, se ha mejorado el soporte para la plataforma Windows: se ha garantizado la generación correcta de la salida del ensamblador para los sistemas Windows de destino, se ha optimizado la generación de datos sobre las llamadas de desconexión (el tamaño de dichos datos se ha reducido en 60 %), se ha agregado la capacidad de crear datos desenredados usando las directivas ensamblador .seh_*.
  • El backend de la arquitectura PowerPC presenta nuevas optimizaciones para bucles e implementación en línea, soporte ampliado para procesadores Power10, soporte agregado para instrucciones MMA para manipulación de matrices y soporte mejorado para el sistema operativo AIX.
  • El backend x86 agrega soporte para los procesadores AMD Zen 3, Intel Alder Lake e Intel Sapphire Rapids, así como instrucciones de procesador HRESET, UINTR y AVXVNNI. Soporte para MPX (Extensiones de protección de memoria) para verificar punteros y garantizar que los límites de la memoria ya no sean compatibles (esta tecnología no está muy extendida y ya se eliminó de GCC y clang). Se agregó soporte al ensamblador para los prefijos {disp32} y {disp8} y los sufijos .d32 y .d8 para controlar el tamaño de los desplazamientos y saltos de operandos. Se agregó un nuevo atributo "tune-cpu" para controlar la inclusión de optimizaciones de microarquitectura.
  • Se ha agregado un nuevo modo “-fsanitize=unsigned-shift-base” al detector de problemas de enteros (desinfectante de enteros, “-fsanitize=integer”) para detectar desbordamientos de enteros sin signo después de un desplazamiento de bit hacia la izquierda.
  • En varios detectores (asan, cfi, lsan, msan, tsan, ubsan sanitizer) se ha agregado soporte para distribuciones de Linux con la biblioteca estándar Musl.
  • Se han ampliado las capacidades del enlazador LLD. Soporte mejorado para el formato ELF, incluidas las opciones agregadas “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program -visibilidad” " Soporte MinGW mejorado. Para el formato Mach-O (macOS), se implementó soporte para arquitecturas arm64, arm e i386, optimizaciones de tiempo de enlace (LTO) y desenrollado de pila para manejo de excepciones.
  • Libc++ implementa nuevas características del estándar C++20 y ha comenzado a desarrollar características de la especificación C++2b. Se agregó soporte para compilar con soporte de localización deshabilitado (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) y dispositivos para generar números pseudoaleatorios (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Fuente: opennet.ru

Añadir un comentario