Lanzamento do paquete de compiladores LLVM 13.0

Despois de seis meses de desenvolvemento, presentouse o lanzamento do proxecto LLVM 13.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 13.0:

  • Soporte implementado para chamadas de cola garantidas (chamar a unha subrutina ao final dunha función, formando unha recursividade de cola se a subrutina se chama a si mesma). O atributo "[[clang::musttail]]" en C++ e "__attribute__((musttail))" en C proporcionan soporte para as chamadas de cola garantidas, usados ​​nunha instrución "return". A función permítelle implementar optimizacións implementando código nunha iteración plana para aforrar consumo de pila.
  • As declaracións "using" e as extensións de clang ofrecen soporte para definir atributos de estilo C++11 usando o formato "[[]]".
  • Engadiuse a marca "-Wreserved-identifier" para mostrar unha advertencia cando especificas identificadores reservados no código de usuario.
  • Engadíronse os indicadores "-Wunused-but-set-parameter" e "-Wunused-but-set-variable" para mostrar un aviso se un parámetro ou variable está definido pero non se utiliza.
  • Engadiuse a marca "-Wnull-pointer-subtraction" para emitir un aviso se o código pode introducir un comportamento indefinido debido ao uso dun punteiro nulo nas operacións de subtracción.
  • Engadiuse a marca "-fstack-usage" para xerar para cada ficheiro de código un ficheiro ".su" adicional que contén información sobre o tamaño dos cadros de pila para cada función definida no ficheiro que se está a procesar.
  • Engadiuse un novo tipo de saída ao analizador estático: "sarif-html", que leva á xeración de informes simultaneamente en formatos HTML e Sarif. Engadiuse unha nova comprobación allocClassWithName. Ao especificar a opción "-analyzer-display-progress", móstrase o tempo de análise de cada función. O analizador de punteiro intelixente (alpha.cplusplus.SmartPtr) está case listo.
  • Ampliáronse as capacidades asociadas ao soporte de OpenCL. Engadido soporte para novas extensións cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields e __cl_clang_non_portable_kernel_param_types. A implementación da especificación OpenCL 3.0 continuou. Para C, a especificación OpenCL 1.2 utilízase por defecto a non ser que se seleccione explícitamente outra versión. Para C++, engadiuse soporte para ficheiros coa extensión ".clcpp".
  • Implementouse o soporte para as directivas de transformación de bucles ("#pragma omp unrol" e "#pragma omp tile") definidas na especificación OpenMP 5.1.
  • Engadíronse opcións á utilidade clang-format: SpacesInLineCommentPrefix para definir o número de espazos antes dos comentarios, IndentAccessModifiers, LambdaBodyIndentation e PPIndentWidth para controlar o aliñamento de entradas, expresións lambda e directivas do preprocesador. Ampliáronse as posibilidades para ordenar a enumeración de ficheiros de cabeceira (SortIncludes). Engadido soporte para formatar ficheiros JSON.
  • Engadíronse unha gran parte das novas comprobacións para que linter clang-tidy.

Innovacións clave en LLVM 13.0:

  • Engadiuse a opción "-ehcontguard" para usar a tecnoloxía CET (Windows Control-flow Enforcement Technology) para protexerse contra a execución de exploits construídos mediante técnicas de programación orientada ao retorno (ROP) na fase de xestión de excepcións.
  • O proxecto debuginfo-test foi renomeado como cross-project-tests e está deseñado para probar compoñentes de diferentes proxectos, sen limitarse á información de depuración.
  • O sistema de montaxe ofrece soporte para construír varias distribucións, por exemplo, unha con utilidades e outra con bibliotecas para desenvolvedores.
  • No backend para a arquitectura AArch64, o soporte para as extensións Armv9-A RME (Extensión de xestión do reino) e SME (Extensión de matriz escalable) está implementada no ensamblador.
  • Engadiuse soporte para ISA V68/HVX ao backend para a arquitectura Hexagon.
  • O backend x86 mellorou o soporte para os procesadores AMD Zen 3.
  • Engadido soporte para GFX1013 RDNA2 APU ao backend AMDGPU.
  • Libc++ segue implementando novas funcións dos estándares C++20 e C++2b, incluíndo a finalización da biblioteca de "conceptos". Engadido soporte para std::filesystem para a plataforma Windows baseada en MinGW. Ficheiros de cabeceira separados , E . Engadiuse a opción de compilación LIBCXX_ENABLE_INCOMPLETE_FEATURES para desactivar os ficheiros de cabeceira cunha funcionalidade non totalmente implementada.
  • Ampliáronse as capacidades do enlazador LLD, no que se implementa o soporte para procesadores Big-endian Aarch64 e o backend de Mach-O pasou a un estado que permite vincular programas normais. Inclúense melloras necesarias para vincular Glibc mediante LLD.
  • A utilidade llvm-mca (Analizador de código de máquina) engadiu soporte para procesadores que executan instrucións en orde (canalización superescalar en orde), como o ARM Cortex-A55.
  • O depurador LLDB para a plataforma AArch64 ofrece soporte completo para a autenticación de punteiro, os rexistros MTE (MemTag, extensión de etiquetado de memoria) e SVE. Engadidos comandos que permiten ligar etiquetas a cada operación de asignación de memoria e organizar unha comprobación do punteiro ao acceder á memoria, que debe estar asociada á etiqueta correcta.
  • O depurador LLDB e o frontend para a linguaxe Fortran - Flang foron engadidos aos conxuntos binarios xerados polo proxecto.

Fonte: opennet.ru

Engadir un comentario