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