Lanzamiento del conjunto de compiladores LLVM 13.0

Después de seis meses de desarrollo, se presentó el lanzamiento del proyecto LLVM 13.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 13.0:

  • Se implementó soporte para llamadas de cola garantizadas (llamar a una subrutina al final de una función, formando una recursividad de cola si la subrutina se llama a sí misma). El soporte para llamadas de cola garantizadas lo proporciona el atributo "[[clang::musttail]]" en C++ y "__attribute__((musttail))" en C, utilizado en una declaración "return". La característica le permite implementar optimizaciones implementando código en una iteración plana para ahorrar consumo de pila.
  • Las declaraciones "using" y las extensiones clang brindan soporte para definir atributos de estilo C++ 11 usando el formato "[[]]".
  • Se agregó el indicador "-Wreserved-identifier" para mostrar una advertencia cuando se especifican identificadores reservados en el código de usuario.
  • Se agregaron los indicadores "-Wunused-but-set-parameter" y "-Wunused-but-set-variable" para mostrar una advertencia si un parámetro o variable está configurado pero no se usa.
  • Se agregó el indicador "-Wnull-pointer-subtraction" para emitir una advertencia si el código podría introducir un comportamiento indefinido debido al uso de un puntero nulo en operaciones de resta.
  • Se agregó el indicador "-fstack-usage" para generar para cada archivo de código un archivo ".su" adicional que contiene información sobre el tamaño de los marcos de pila para cada función definida en el archivo que se está procesando.
  • Se ha agregado un nuevo tipo de salida al analizador estático: "sarif-html", que genera informes simultáneamente en formatos HTML y Sarif. Se agregó una nueva verificación allocClassWithName. Al especificar la opción “-analyzer-display-progress”, se muestra el tiempo de análisis de cada función. El analizador de puntero inteligente (alpha.cplusplus.SmartPtr) está casi listo.
  • Se han ampliado las capacidades asociadas con el soporte de OpenCL. Se agregó soporte para las nuevas extensiones cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields y __cl_clang_non_portable_kernel_param_types. Continuó la implementación de la especificación OpenCL 3.0. Para C, la especificación OpenCL 1.2 se utiliza de forma predeterminada a menos que se seleccione explícitamente otra versión. Para C++, se agregó soporte para archivos con la extensión ".clcpp".
  • Se ha implementado la compatibilidad con las directivas de transformación de bucles (“#pragma omp unrol” y “#pragma omptile”) definidas en la especificación OpenMP 5.1.
  • Se agregaron opciones a la utilidad clang-format: SpacesInLineCommentPrefix para definir la cantidad de espacios antes de los comentarios, IndentAccessModifiers, LambdaBodyIndentation y PPIndentWidth para controlar la alineación de entradas, expresiones lambda y directivas de preprocesador. Se han ampliado las posibilidades de ordenar la enumeración de archivos de encabezado (SortIncludes). Se agregó soporte para formatear archivos JSON.
  • Se han agregado una gran cantidad de comprobaciones nuevas a linter clang-tidy.

Innovaciones clave en LLVM 13.0:

  • Se agregó la opción "-ehcontguard" para usar la tecnología CET (Windows Control-flow Enforcement Technology) para proteger contra la ejecución de exploits creados utilizando técnicas de programación orientada al retorno (ROP) en la etapa de manejo de excepciones.
  • El proyecto debuginfo-test pasó a llamarse cross-project-tests y está diseñado para probar componentes de diferentes proyectos, sin limitarse a información de depuración.
  • El sistema ensamblador brinda soporte para crear varias distribuciones, por ejemplo, una con utilidades y la otra con bibliotecas para desarrolladores.
  • En el backend de la arquitectura AArch64, la compatibilidad con las extensiones Armv9-A RME (Realm Management Extension) y SME (Scalable Matrix Extension) se implementa en el ensamblador.
  • Se ha agregado soporte para ISA V68/HVX al backend de la arquitectura Hexagon.
  • El backend x86 ha mejorado el soporte para los procesadores AMD Zen 3.
  • Se agregó soporte para la APU GFX1013 RDNA2 al backend de AMDGPU.
  • Libc++ continúa implementando nuevas características de los estándares C++20 y C++2b, incluida la finalización de la biblioteca de "conceptos". Se agregó soporte para std::filesystem para la plataforma Windows basada en MinGW. Los archivos de encabezado , y están separados. Se agregó la opción de compilación LIBCXX_ENABLE_INCOMPLETE_FEATURES para deshabilitar archivos de encabezado con funcionalidad no completamente implementada.
  • Se han ampliado las capacidades del enlazador LLD, en el que se implementa soporte para procesadores Big-endian Aarch64, y el backend Mach-O se ha llevado a un estado que permite vincular programas regulares. Se incluyeron mejoras necesarias para vincular Glibc usando LLD.
  • La utilidad llvm-mca (Machine Code Analyzer) ha agregado soporte para procesadores que ejecutan instrucciones en orden (canalización superescalar en orden), como ARM Cortex-A55.
  • El depurador LLDB para la plataforma AArch64 proporciona soporte completo para autenticación de puntero, MTE (MemTag, extensión de etiquetado de memoria) y registros SVE. Se agregaron comandos que le permiten vincular etiquetas a cada operación de asignación de memoria y organizar una verificación del puntero al acceder a la memoria, que debe estar asociado con la etiqueta correcta.
  • El depurador LLDB y la interfaz para el lenguaje Fortran - Flang se han agregado a los ensamblados binarios generados por el proyecto.

Fuente: opennet.ru

Añadir un comentario