Linux Adictos David Naranjo  

LLVM 11.0 llega con actualización a Python 3, mejoras para RISC-V y mas

LLVM

Después de seis meses de desarrollo se ha presentado el lanzamiento de la nueva edición del proyecto LLVM 11.0 en la cual se presentan diversas mejoras, tales como la actualización a Python 3, parches para admitir instrucciones experimentales en RISC-V y muchos cambios mas.

Para quienes desconocen de LLVM, deben saber que es un kit de herramientas compatible con GCC (compiladores, optimizadores y generadores de código) que compila programas en instrucciones virtuales intermedias de código de bits similares a RISC (máquina virtual de bajo nivel con un sistema de optimización de múltiples niveles).

Está diseñada para optimizar el tiempo de compilación, el tiempo de enlazado, el tiempo de ejecución en cualquier lenguaje de programación que el usuario quiera definir. Implementado originalmente para compilar C y C++, el diseño agnóstico de LLVM con respecto al lenguaje, y el éxito del proyecto han engendrado una amplia variedad de lenguajes.

El pseudocódigo generado puede convertirse utilizando el compilador JIT en instrucciones de máquina directamente en el momento de la ejecución del programa.

Principales novedades de LLVM 11.0

En esta nueva version de LLVM 11.0 el sistema de compilación se ha movido para usar Python 3, como tal el uso de Python 3 no es forzado, ya que en caso de que no está disponible, la opción de reversión se implementa para usar Python 2.

El atributo vector-function-abi-variant se ha agregado a la representación intermedia (IR) para describir el mapeo entre las funciones escalares y vectoriales para las llamadas de vectorización. Dos tipos de vectores separados, llvm ::FixedVectorType y llvm::ScalableVectorType, se extraen de llvm::VectorType.

El comportamiento indefinido es la ramificación basada en undef y el paso de valores indefinidos a funciones de biblioteca estándar.

En memset/memcpy/memmove, se permite pasar punteros indefinidos, pero si el parámetro con el tamaño es igual a cero.

LLJIT agrega soporte para realizar inicializaciones estáticas a través de los métodos LLJIT::initialize y LLJIT::deinitialize.

Se agregó la capacidad de agregar bibliotecas estáticas a JITDylib utilizando la clase StaticLibraryDefinitionGenerator. Se agregó C API para ORCv2 (API para crear compiladores JIT).

Por la parte de la mejora de soporte para las diferentes arquitecturas de procesadores:

  • Se agregó soporte para los procesadores Cortex-A34, Cortex-A77, Cortex-A78 y Cortex-X1 en el backend de la arquitectura AArch64. Se implementaron las extensiones ARMv8.2-BF16 (BFloat16) y ARMv8.6-A, que incluyen RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) y ARMv8.0-DGH (sugerencia de recopilación de datos).
  • Se agregó soporte para los procesadores Cortex-M55, Cortex-A77, Cortex-A78 y Cortex-X1 en el backend ARM. Implementó las extensiones Armv8.6-A Matrix Multiply y RMv8.2-AA32BF16 BFloat16.
  • Se agregó soporte para la generación de código para procesadores POWER10 en el backend de PowerPC. Optimizaciones de bucle mejoradas y soporte mejorado para operaciones de punto flotante.
  • El backend de la arquitectura RISC-V puede recibir parches con soporte para conjuntos de instrucciones extendidas experimentales que aún no se han aprobado oficialmente.

Además de ello, se proporciona la capacidad de generar código para funciones de enlace integradas a instrucciones vectoriales SVE.

El backend para la arquitectura AVR se ha movido de la categoría experimental a las estables incluidas en la distribución base.

El backend x86 admite instrucciones Intel AMX y TSXLDTRK. Se agregó protección contra ataques LVI (Load Value Injection) y también se implementó el mecanismo general de Supresión de efectos secundarios de ejecución especulativa para bloquear ataques causados ​​por la ejecución especulativa de operaciones en la CPU.

De los demás cambios que se destacan:

  • El backend para la arquitectura SystemZ agrega soporte para MemorySanitizer y LeakSanitizer.
  • Libc ++ agrega soporte para el archivo de encabezado de constantes matemáticas <numbers>.
  • Capacidades ampliadas del enlazador LLD.
  • Compatibilidad con ELF mejorada, incluidas las opciones agregadas «–lto-emit-asm», «–lto-whole-program-visible», «–print-archive-stats», «–shuffle-section», «–thinlto-single-module», «–unique», «–rosegment», «–threads = N».
  • Se agregó la opción «–time-trace» para guardar el rastreo en un archivo, que luego se puede analizar a través de la interfaz de rastreo chrome: // en Chrome.
  • Una interfaz con un compilador Go (llgo) se ha eliminado de la versión y puede reestructurarse en el futuro.

Finalmente si quieres conocer mas al respecto sobre esta nueva version, puedes consultar los detalles en el siguiente enlace.

Leave A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.