Lanzamento do paquete de compiladores LLVM 16.0

Despois de seis meses de desenvolvemento, presentouse o lanzamento do proxecto LLVM 16.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 principais en Clang 16.0:

  • O estándar C++/ObjC++ predeterminado é gnu++17 (anteriormente gnu++14), o que significa que as funcións C++17 con extensións GNU son compatibles por defecto. Para devolver o comportamento anterior, pode usar a opción "-std=gnu++14".
  • Funcións avanzadas implementadas relacionadas co estándar C++20:
    • Funcións de membros especiais condicionalmente triviais,
    • capturando enlaces estruturados en funcións lambda,
    • Operador de igualdade dentro de expresións,
    • Opción para omitir a palabra clave typename nalgúns contextos,
    • Inicialización agregada válida entre parénteses ("Aggr(val1, val2)").
  • Implementáronse as características definidas no futuro estándar C++2b:
    • Permítese poñer etiquetas ao final das expresións compostas,
    • operador estático(),
    • operador estático [],
    • A compatibilidade co tipo char8_t está garantida,
    • Ampliouse o intervalo de caracteres permitidos para o seu uso en "\N{...}".
    • Engadida a posibilidade de usar variables declaradas como "constexpr estática" nas funcións declaradas como constexpr.
  • Implementáronse as funcións definidas no futuro estándar C C2x:
    • Para desactivar o aviso "-Wunused-label", pódese aplicar o atributo "[[maybe_unused]]" ás etiquetas
    • Permítese colocar etiquetas en calquera lugar dentro de expresións compostas,
    • Engadidos operadores typeof e typeof_unqual,
    • Un novo tipo nullptr_t e unha constante nullptr para definir punteiros nulos que poden converterse en calquera tipo de punteiro e representar unha variante de NULL que non está ligada a tipos enteiros e void*.
    • No modo C2x, permítese chamar á macro va_start cun número variable de argumentos (variadic).
  • Nos modos de cumprimento C99, C11 e C17, as opcións predeterminadas "-Wimplicit-function-declaration" e "-Wimplicit-int" agora producen un erro en lugar dunha advertencia.
  • O uso indirecto de "void *" (por exemplo, "void func(void *p) { *p; }") no modo C++ agora xera un erro, similar ao ISO C++, GCC, ICC e MSVC.
  • Especificar campos de bits como operandos de instrucións (por exemplo, "__asm ​​​​{mov eax, s.bf }") en bloques de ensamblaxe en liña ao estilo de Microsoft agora xera un erro.
  • Engadidos diagnósticos para a presenza de diferentes estruturas e unións co mesmo nome en distintos módulos.
  • Ampliáronse as capacidades asociadas co soporte OpenCL e OpenMP. Diagnóstico mellorado para os modelos C++ utilizados nos argumentos do núcleo de OpenCL. Compatibilidade mellorada do bloque de filas para AMDGPU. O atributo substantivo engádese implicitamente a todas as funcións. Soporte mellorado para funcións integradas.
  • Engadiuse a posibilidade de usar a variable de ambiente CLANG_CRASH_DIAGNOSTICS_DIR para definir o directorio no que se gardan os datos de diagnóstico de fallos.
  • Actualizouse a compatibilidade de Unicode coa especificación Unicode 15.0. Algúns símbolos matemáticos están permitidos nos identificadores, como "₊" (por exemplo, "xₖ₊₁ dobre").
  • Engadiuse compatibilidade para cargar varios ficheiros de configuración (primeiro cárganse os ficheiros de configuración predeterminados e despois os especificados mediante a marca "--config=", que agora se pode especificar varias veces). Cambiou a orde de carga predeterminada dos ficheiros de configuración: clang tenta cargar primeiro o ficheiro - .cfg, e se non se atopa tenta cargar dous ficheiros .cfg e .cfg. Para desactivar a carga de ficheiros de configuración de forma predeterminada, engadiuse a marca "--no-default-config".
  • Para garantir compilacións repetibles, é posible substituír os valores de data e hora actuais nas macros __DATE__, __TIME__ e __TIMESTAMP__ pola hora especificada na variable de ambiente SOURCE_DATE_EPOCH.
  • Para comprobar a presenza de funcións integradas (builtin) que se poden usar no contexto das constantes, engadiuse a macro "__has_constexpr_builtin".
  • Engadiuse unha nova marca de compilación "-fcoro-aligned-allocation" para a asignación de marcos de rutina aliñados.
  • A marca "-fstrict-flex-arrays=" implementa soporte para o terceiro nivel de verificación de elementos de matriz flexible nas estruturas (Membros de matriz flexibles, unha matriz de tamaño indefinido ao final da estrutura). No terceiro nivel, só o tamaño "[]" (por exemplo, "int b[]") se trata como unha matriz flexible, pero o tamaño "[0]" (por exemplo, "int b[0]") non é.
  • Engadiuse a marca "-fmodule-output" para habilitar o modelo de compilación monofásico para os módulos C++ estándar.
  • Engadiuse o modo "-Rpass-analysis=stack-frame-layout" para axudar a diagnosticar problemas co deseño de cadros de pila.
  • Engadiu un novo atributo __attribute__((target_version("cpu_features"))) e estendeuse a funcionalidade do atributo __attribute__((target_clones("cpu_features1","cpu_features2",...))) para seleccionar versións específicas das funcións proporcionadas por AArch64 CPUs.
  • Ferramentas de diagnóstico ampliadas:
    • Engadiuse o aviso "-Wsingle-bit-bitfield-constant-conversion" para detectar o truncamento implícito ao asignar un a un campo de bits asinado dun só bit.
    • Ampliouse o diagnóstico de variables constexpr non inicializadas.
    • Engadíronse avisos "-Wcast-function-type-strict" e "-Wincompatible-function-pointer-types-strict" para identificar problemas potenciais coa transmisión do tipo de función.
    • Engadidos diagnósticos para usar nomes de módulo incorrectos ou reservados en bloques de exportación.
    • Detección mellorada das palabras clave "automáticas" que faltan nas definicións.
    • A implementación do aviso "-Winteger-overflow" engadiu comprobacións de situacións adicionais que provocan desbordamentos.
  • Implementouse soporte para a arquitectura do conxunto de instrucións LoongArch (-march=loongarch64 ou -march=la464), usada nos procesadores Loongson 3 5000 e implementando o novo RISC ISA, similar a MIPS e RISC-V.

Innovacións clave en LLVM 16.0:

  • O código LLVM pode usar elementos definidos no estándar C++17.
  • Incrementáronse os requisitos ambientais para a construción de LLVM. As ferramentas de compilación agora deberían soportar o estándar C++17, é dicir. Para crear, necesitas polo menos GCC 7.1, Clang 5.0, Apple Clang 10.0 ou Visual Studio 2019 16.7.
  • O backend para a arquitectura AArch64 engade soporte para CPU Cortex-A715, Cortex-X3 e Neoverse V2, ensamblador para RME MEC (contextos de cifrado de memoria), extensións Armv8.3 (número complexo) e función de versión múltiple.
  • No backend para a arquitectura ARM, o soporte para as plataformas de destino Armv2, Armv2A, Armv3 e Armv3M foi descontinuado, para o que non se garantiu a xeración do código correcto. Engadida a capacidade de xerar código para instrucións para traballar con números complexos.
  • O backend para a arquitectura X86 engadiu soporte para arquitecturas de conxunto de instrucións (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Engadido soporte para instrucións RDMSRLIST, RMSRLIST e WRMSRNS. Opcións implementadas "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" e "-mcpu=grandridge".
  • Engadiuse soporte oficial para a plataforma LoongArch.
  • Backends mellorados para arquitecturas MIPS, PowerPC e RISC-V
  • Engadido soporte para depurar executables de 64 bits para a arquitectura LoongArch ao depurador LLDB. Mellorado o manexo dos símbolos de depuración COFF. Proporcionou filtrado de DLL duplicados na lista de módulos de Windows cargados.
  • Na biblioteca Libc++, o traballo principal centrouse na implementación de soporte para novas funcións dos estándares C++20 e C++23.
  • O enlazador LDD reduce significativamente o tempo de conexión ao paralelizar as operacións de exploración de reubicación de enderezos e de inicialización de seccións. Engadido soporte para a compresión de seccións usando o algoritmo ZSTD.

Fonte: opennet.ru

Engadir un comentario