Lanzamento do paquete de compiladores LLVM 12.0

Despois de seis meses de desenvolvemento, presentouse o lanzamento do proxecto LLVM 12.0: un conxunto de ferramentas compatible con GCC (compiladores, optimizadores e xeradores de código) que compila programas en código de bits intermedio de instrucións virtuais tipo RISC (unha máquina virtual de baixo nivel cun sistema de optimización multinivel). O pseudocódigo xerado pódese converter mediante un compilador JIT en instrucións de máquina directamente no momento da execución do programa.

Melloras en Clang 12.0:

  • O soporte para os atributos "probable" e "improbable" propostos no estándar C++20 foi implementado e habilitado de forma predeterminada, o que permite que o optimizador sexa informado sobre a probabilidade de que se desencadee a construción condicional (por exemplo, "[[probable ]] se (aleatoria > 0) {“).
  • Engadido soporte para procesadores AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) e Intel Sapphire Rapids (-march=sapphirerapids).
  • Engadiuse compatibilidade coas marcas "-march=x86-64-v[234]" para seleccionar os niveis de arquitectura x86-64 (v2 - abrangue as extensións SSE4.2, SSSE3, POPCNT e CMPXCHG16B; v3 - AVX2 e MOVBE; v4 - AVX-512 ).
  • Engadiuse soporte para os procesadores Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) e Fujitsu A64FX (a64fx). Por exemplo, para habilitar optimizacións para as CPU Neoverse-V1, pode especificar "-mcpu=neoverse-v1".
  • Para a arquitectura AArch64, engadíronse novas marcas do compilador "-moutline-atomics" e "-mno-outline-atomics" para activar ou desactivar as funcións auxiliares de operacións atómicas, como "__aarch64_cas8_relax". Tales funcións detectan no tempo de execución se está dispoñible a compatibilidade de LSE (Extensións do sistema grande) e usan as instrucións do procesador atómico proporcionadas ou usan as instrucións LL/SC (Load-link/store-conditional) para a sincronización.
  • Engadiuse a opción "-fbinutils-version" para seleccionar a versión de destino da suite binutils para a compatibilidade co comportamento do enlazador e do ensamblador máis antigo.
  • Para ficheiros executables ELF, cando se especifica a marca "-gz", a compresión da información de depuración mediante a biblioteca zlib está habilitada por defecto (gz=zlib). Enlazar os ficheiros obxecto resultantes require lld ou GNU binutils 2.26+. Para restaurar a compatibilidade con versións antigas de binutils, pode especificar "-gz=zlib-gnu".
  • O punteiro "este" agora está procesado con comprobacións non nulas e desreferenciables (N). Para eliminar o atributo non nulo, se precisa usar valores NULL, pode usar a opción "-fdelete-null-pointer-checks".
  • Na plataforma Linux, o modo "-fasynchronous-unwind-tables" está habilitado para as arquitecturas AArch64 e PowerPC para xerar táboas de chamadas de desenrolo, como en GCC.
  • En "#pragma clang loop vectorize_width" engadiuse a posibilidade de especificar as opcións "fixo" (predeterminado) e "escalable" para seleccionar o método de vectorización. O modo "escalable", independente da lonxitude do vector, é experimental e pódese usar en hardware que admita a vectorización escalable.
  • Compatibilidade mellorada para a plataforma Windows: preparáronse conxuntos binarios oficiais para Windows nos sistemas Arm64, incluíndo o compilador Clang, o enlazador LLD e as bibliotecas de tempo de execución do compilador-rt. Cando se crea para plataformas de destino MinGW, engádese o sufixo .exe, mesmo cando se compila cruzada.
  • Ampliáronse as capacidades asociadas ao soporte para OpenCL, OpenMP e CUDA. Engadíronse as opcións "-cl-std=CL3.0" e "-cl-std=CL1.0" para seleccionar opcións de macro para OpenCL 3.0 e OpenCL 1.0. Ampliáronse as ferramentas de diagnóstico.
  • Engadido soporte para as instrucións HRESET, UINTR e AVXVNNI implementadas nalgúns procesadores baseados en x86.
  • Nos sistemas x86, a compatibilidade coa opción "-mtune=" está habilitada, habilitando as optimizacións microarquitectónicas seleccionadas independentemente do valor "-march=".
  • O analizador estático mellorou o procesamento dalgunhas funcións POSIX e mellorou significativamente a determinación do resultado das operacións condicionais cando hai varios valores simbólicos na comparación. Engadíronse novas comprobacións: fuchia.HandleChecker (define identificadores nas estruturas), webkit.UncountedLambdaCapturesChecker webkit e alpha.webkit.UncountedLocalVarsChecker (ten en conta as peculiaridades de traballar con punteiros no código do motor de WebKit).
  • Nas expresións utilizadas no contexto das constantes, o uso das funcións incorporadas __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bsfq, __bsfq, __reverse,_bsr_ wap, __bswapd, __bswap64, __ está permitido bswapq , _castf*, __rol* e __ror*.
  • Engadiuse unha opción BitFieldColonSpacing á utilidade clang-format para seleccionar o espazo entre os identificadores, as columnas e as definicións de campo.
  • O servidor de caché clangd (Clang Server) na plataforma Linux reduciu significativamente o consumo de memoria durante o funcionamento a longo prazo (se ofrecen chamadas periódicas a malloc_trim para devolver páxinas de memoria libres ao sistema operativo).

Innovacións clave en LLVM 12.0:

  • O soporte para a ferramenta de compilación llvm-build escrita en Python foi descontinuado e, no seu lugar, o proxecto cambiou completamente a usar o sistema de compilación CMake.
  • No backend para a arquitectura AArch64, mellorouse o soporte para a plataforma Windows: garantiuse a correcta xeración de saída do ensamblador para os sistemas Windows de destino, optimizouse a xeración de datos nas chamadas de desenrolo (o tamaño destes datos reduciuse en 60 %), engadíronse as directivas .seh_* a capacidade de crear datos de desenrolo usando o ensamblador.
  • O backend para a arquitectura PowerPC presenta novas optimizacións para bucles e despregamento en liña, soporte ampliado para procesadores Power10, soporte adicional para instrucións MMA para a manipulación da matriz e soporte mellorado para o sistema operativo AIX.
  • O backend x86 engade soporte para procesadores AMD Zen 3, Intel Alder Lake e Intel Sapphire Rapids, así como instrucións dos procesadores HRESET, UINTR e AVXVNNI. Compatibilidade con MPX (extensións de protección de memoria) para comprobar os punteiros para garantir que xa non se admiten os límites da memoria (esta tecnoloxía non está moi estendida e xa foi eliminada de GCC e clang). Engadido soporte ao ensamblador para os prefixos {disp32} e {disp8} e os sufixos .d32 e .d8 para controlar o tamaño dos desplazamentos e saltos de operandos. Engadiuse un novo atributo "tune-cpu" para controlar a inclusión de optimizacións microarquitectónicas.
  • Engadiuse un novo modo "-fsanitize=unsigned-shift-base" ao detector de problemas de enteiros (desinfectante de enteiros, "-fsanitize=integer") para detectar desbordamentos de enteiros sen asinar despois de desprazarse un pouco á esquerda.
  • En varios detectores (asan, cfi, lsan, msan, tsan, ubsan sanitizer) engadiuse soporte para distribucións de Linux coa biblioteca estándar Musl.
  • Ampliáronse as capacidades do enlazador LLD. Compatibilidade mellorada para o formato ELF, incluíndo as opcións engadidas "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program" - visibilidade" Soporte MinGW mellorado. Para o formato Mach-O (macOS), implementouse soporte para arquitecturas arm64, arm e i386, optimizacións de tempo de ligazón (LTO) e desenrolamento de pilas para o manexo de excepcións.
  • Libc++ implementa novas funcións do estándar C++20 e comezou o desenvolvemento de funcións da especificación C++2b. Engadiuse compatibilidade para construír con desactivación da compatibilidade de localización ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") e dispositivos para xerar números pseudoaleatorios ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF").

Fonte: opennet.ru

Engadir un comentario