Tras seis meses de desenvolvemento, lanzouse LLVM 22.1.0. Desenvolve ferramentas (compiladores, optimizadores e xeradores de código) que compilan programas en código de bits intermedio de instrucións virtuais de tipo RISC (unha máquina virtual de baixo nivel cun sistema de optimización multinivel). O pseudocódigo xerado pódese converter en código máquina para unha plataforma de destino determinada ou ser usado por un compilador xusto a tempo (JIT) para xerar instrucións máquina directamente durante a execución do programa. Baseado nas tecnoloxías LLVM, o proxecto está a desenvolver o compilador Clang, compatible coas linguaxes de programación C, C++ e Objective-C. A partir da rama 18.x, o proxecto cambiou a un novo esquema de numeración de versións, segundo o cal se usa a versión 0 ("N.0") durante o desenvolvemento e a primeira versión estable está numerada como "N.1".
Entre as melloras en Clang 22:
- Engadiuse compatibilidade con tokens de asignación de memoria (Allocation Tokens) para marcar as operacións de asignación de memoria realizadas mediante funcións como malloc cun identificador único. Os tokens de asignación permiten estruturar a información da memoria dinámica, simplificar a detección de fugas de memoria e habilitar a agrupación de obxectos segundo o seu propósito ou patróns de modificación (por exemplo, separar os datos "quentes" dos "fríos"). Para activalos, use o indicador "-fsanitize=alloc-token".
- Características relacionadas coa linguaxe C:
- Implementouse unha especificación preliminar que define o mecanismo de execución diferida "defer", o que permite executar accións cando se pecha o ámbito actual. Engadiuse o indicador "-fdefer-ts" para activar a compatibilidade con "defer".
- Engadiuse a función integrada __builtin_stack_address(), que reflicte unha función similar en GCC. Esta función devolve o enderezo de pila separando a área de pila da función actual que chamou a __builtin_stack_address() e as funcións posteriores que chama.
- Capacidades que se están a desenvolver para o futuro estándar C2y:
- Engadiuse compatibilidade con bucles con nome, o que permite asignar nomes a bucles e instrucións switch, que se poden especificar nas instrucións break e continue para definir explicitamente o bucle do que saír. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // ir a CONT1 continue outer; // ir a CONT2 // CONT1 } // CONT2 }
- A implementación da macro "__COUNTER__" integrada, deseñada para xerar nomes de identificadores únicos, foi ampliada e incluída no estándar. Estableceuse un límite de 2147483647 chamadas a esta macro; superar este límite xerará un erro.
- Eliminouse o aviso (-Wstatic-in-inline) ao usar funcións ou variables estáticas dentro de funcións declaradas como "extern inline".
- Capacidades definidas na norma C23 C:
- O ficheiro de cabeceira float.h agora admite as macros FLT_SNAN, DBL_SNAN e LDBL_SNAN, que implementan valores NaN sinalizados (que causan unha excepción cando se usan en operacións aritméticas) para os tipos float, double e long double.
- Corrixiuse un erro que impedía que diferentes tipos sen nome se tratasen como compatibles dentro da mesma unidade de tradución se tiñan os mesmos campos.
- O indicador "-MG" empregado para ignorar os ficheiros de cabeceira que faltan durante a análise de dependencias ampliouse ás directivas "#embed" e agora suprime o erro "ficheiro non atopado" cando falta un ficheiro especificado nunha directiva "#embed".
- Características relacionadas con C++:
- Engadiuse a capacidade de usar ligazóns estruturadas no contexto "constexpr", tal e como se desenvolveu na especificación C++2c (C++26). Isto significa que as referencias a expresións constantes agora poden ser elas mesmas expresións constantes. Implementouse compatibilidade con matrices e estruturas simples (as tuplas aínda non son compatibles). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Como esixe o estándar C++20, as restricións agora convértense ao formato estándar antes de seren comprobadas, o que permite mensaxes de diagnóstico máis precisas e unha xestión axeitada dos erros de substitución nos argumentos do modelo que se usan só nos identificadores de concepto.
- Engadiuse unha familia de funcións integradas "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" para descubrir se os operadores de comparación "<", ">", "<=" e ">=" foron sintetizados a partir do operador "<=>".
- O parámetro "-Wincompatible-pointer-types" foi modificado para mostrar un erro en lugar dun aviso. Para volver ao comportamento anterior, use a opción "-Wno-error=incompatible-pointer-types".
- Engadíronse as funcións integradas __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter e __builtin_dedup_pack. Por exemplo, builtin_dedup_pack permíteche eliminar duplicados dunha lista de tipos: usando MyTypeList = TypeList<__builtin_dedup_pack …>; // o tipo resultante será TypeList
- Ao depurar o comportamento indefinido con UBSan (-fsanitize=undefined -fsanitize-trap=undefined), a información da causa do erro agora inclúese na información de depuración xerada. Engadiuse o indicador "-fsanitize-debug-trap-reasons" para especificar o nivel de detalle na información de erro. Pódese configurar como "básico" para descricións xerais (por exemplo, "Suma de enteiros desbordada") e como "detallado" para incluír información detallada (por exemplo, "suma de enteiros con signo desbordada en 'a + b'").
- Engadíronse novas marcas do compilador:
- "-f[no-]sanitize-debug-trap-reasons" para controlar se as razóns das excepcións de captura están incorporadas na información de depuración ao compilar co modo "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" e "-fsanitize-alloc-token-extended" para xestionar os tokens de asignación de memoria.
- "-fmatrix-memory-layout" para controlar a disposición da memoria dos tipos de matrices (por exemplo, columna-major para columna-major, fila-major para fila-major).
- As funcións agora teñen un atributo "malloc_span", semellante ao atributo malloc pero aplicable a funcións que devolven estruturas de tipo span que conteñen un punteiro e un campo co tamaño ou un punteiro ao final do bloque.
- Engadiuse o atributo "modular_format" para seleccionar dinamicamente a implementación vinculada estaticamente requirida da función printf no momento da ligazón.
- Ampliáronse as ferramentas de diagnóstico e análise estática e engadíronse novas comprobacións (varias ducias de melloras relacionadas co diagnóstico).
- Engadíronse características intrínsecas adicionais para as extensións SSE, AVX e AVX512 ao backend X86. Engadíronse modos de compilación para CPU Intel baseadas nas microarquitecturas Wildcat Lake (-march=wildcatlake) e Nova Lake (-march=novalake).
- O backend de AArch64 agora admite os procesadores Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) e Arm C1-Ultra (c1-ultra). Engadíronse funcións integradas adicionais para as instrucións FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] e FCVTA[US]. A compatibilidade coa multiversión de funcións (FMV) estabilizouse. Os usuarios agora poden anular a prioridade de diferentes versións de funcións.
- Engadiuse compatibilidade coa arquitectura LoongArch32 (LA32R, LA32S).
- Backends mellorados para arquitecturas ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly e PowerPC.
Fonte: opennet.ru
