Lanzamento do paquete de compiladores LLVM 11.0

Despois de seis meses de desenvolvemento presentado lanzamento do proxecto LLVM 11.0 - Ferramentas compatibles con GCC (compiladores, optimizadores e xeradores de código) que compilan programas nun 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 pode ser convertido polo compilador JIT en instrucións de máquina xusto no momento da execución do programa.

O cambio fundamental na nova versión foi a inclusión de brida, un frontend para o idioma Fortran. Flang admite Fortran 2018, OpenMP 4.5 e OpenACC 3.0, pero o desenvolvemento do proxecto aínda non se completou e o front-end limítase a analizar o código e verificalo. Aínda non se admite a xeración de código intermedio LLVM e, para xerar ficheiros executables, xérase código canónico e pásase a un compilador externo de Fortran.

Melloras en Clang 11.0:

  • Engadida a posibilidade de restaurar a árbore de sintaxe abstracta (AST) para código C++ incorrecto, que se pode usar para axudar a diagnosticar erros e proporcionar información adicional para utilidades externas como clang-tidy e clangd. A función está habilitada por defecto para o código C++ e contrólase mediante as opcións "-Xclang -f[no-]recovery-ast".
  • Engadíronse novos modos de diagnóstico:
    • "-Wpointer-to-int-cast" é un grupo de avisos sobre a conversión de punteiros a un tipo int enteiro que non contén todos os valores posibles.
    • "-Wuninitialized-const-reference" - unha advertencia sobre o paso de variables non inicializadas en parámetros de función que aceptan argumentos de referencia co atributo "const".
    • "-Wimplicit-const-int-float-conversion" é unha advertencia sobre a conversión implícita dunha constante real a un tipo enteiro, activada por defecto.
  • Para a plataforma ARM, ofrécense funcións C integradas no compilador (intrínsecos) sendo substituído polas instrucións vectoriais Arm v8.1-M MVE e CDE eficientes. As funcións dispoñibles defínense nos ficheiros de cabeceira arm_mve.h e arm_cde.h.
  • Engadido un conxunto de tipos de enteiros estendidos _ExtInt(N) que che permiten crear tipos que non sexan un múltiplo dunha potencia de dous, que se poden procesar de forma eficiente en FPGA/HLS. Por exemplo, _ExtInt(7) define un tipo enteiro que consta de 7 bits.
  • Engadíronse macros que definen soporte para funcións C integradas baseadas en instrucións ARM SVE (Extensión vectorial escalable):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Por exemplo, a macro __ARM_FEATURE_SVE defínese ao xerar o código AArch64 coa opción de liña de comandos "-march=armv8-a+sve".

  • O indicador "-O" agora identifícase co modo de optimización "-O1" en lugar de "-O2".
  • Engadíronse novas marcas do compilador:
    • "-fstack-clash-protection" - permite a protección contra interseccións de pila e montón.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - permítelle seleccionar o modo de controlador de excepcións para números de coma flotante.
    • "-ffp-model={precise,strict,fast}" simplifica o acceso a unha serie de opcións especializadas para números de coma flotante.
    • "-fpch-codegen" e "-fpch-debuginfo" para xerar unha cabeceira precompilada (PCH) con ficheiros de obxecto separados para código e debuginfo.
    • "-fsanitize-coverage-allowlist" e "-fsanitize-coverage-blocklist" para comprobar as probas de cobertura da lista branca e da lista negra.
    • "-mtls-size={12,24,32,48}" para seleccionar o tamaño de TLS (almacenamento local de fíos).
    • "-menable-experimental-extension" para habilitar extensións experimentais RISC-V.
  • Por defecto, C usa o modo "-fno-common", que permite un acceso máis eficiente a variables globais nalgunhas plataformas.
  • Moveuse a caché do módulo predeterminada de /tmp ao directorio ~/.cache. Podes usar a marca "-fmodules-cache-path=" para anular.
  • O estándar C predeterminado actualizouse de gnu11 a gnu17.
  • Engadido soporte preliminar para a extensión GNU C "liña asm» para engadir insercións do ensamblador. A extensión só se analiza ata agora, pero non se procesa de ningún xeito.
  • Capacidades ampliadas relacionadas co soporte para OpenCL e CUDA. Engadiuse soporte para diagnósticos de bloques OpenCL 2.0 e implementáronse novas funcións de OpenMP 5.0.
  • Engadida a opción IndentExternBlock á utilidade de formato clang para o aliñamento dentro dos bloques externos "C" e externos "C++".
  • Mellorado o manexo dos construtores herdados en C++ no analizador estático. Engadíronse novas comprobacións alpha.core.C11Lock e alpha.fuchsia.Lock para comprobar se hai bloqueos, alpha.security.cert.pos.34c para detectar o uso inseguro de putenv, webkit.NoUncountedMemberChecker e webkit.RefCntblBaseVirtualDtor para detectar problemas con tipos incontables, alpha .cplusplus .SmartPtr para comprobar a desreferencia de punteiro intelixente nula.
  • En linter clang-tidy engadido gran parte dos novos cheques.
  • O servidor de caché clangd (Clang Server) mellorou o rendemento e engadiu novas capacidades de diagnóstico.

O principal innovacións LLVM 11.0:

  • O sistema de compilación cambiouse para usar Python 3. Se Python 3 non está dispoñible, implementouse a posibilidade de volver usar Python 2.
  • O front-end cun compilador para a linguaxe Go (llgo) está excluído da versión, que pode ser reestruturado no futuro.
  • O atributo vector-function-abi-variant engadiuse á representación intermedia (IR) para describir a correspondencia entre funcións escalares e vectoriais para a vectorización de chamadas. Dous tipos de vectores separados llvm::FixedVectorType e llvm::ScalableVectorType están separados de llvm::VectorType.
  • Considérase un comportamento indefinido ramificar en función de valores udef e pasar valores undef a funcións de biblioteca estándar. EN
    memset/memcpy/memmove permítese pasar punteiros undef, pero se o parámetro con tamaño é cero.

  • LLJIT engadiu soporte para realizar inicializacións estáticas a través dos métodos LLJIT::initialize e LLJIT::deinitialize. Implementouse a capacidade de engadir bibliotecas estáticas a JITDylib usando a clase StaticLibraryDefinitionGenerator. Engadida a API C para ORCv2 (API para crear compiladores JIT).
  • Engadido soporte para procesadores Cortex-A64, Cortex-A34, Cortex-A77 e Cortex-X78 ao backend da arquitectura AArch1. Implementáronse extensións ARMv8.2-BF16 (BFloat16) e ARMv8.6-A, incluíndo RMv8.6-ECV (virtualización de contador mellorada), ARMv8.6-FGT (trampas de gran fino), ARMv8.6-AMU (virtualización de monitores de actividade) e ARMv8.0-DGH (suxestión de recollida de datos). Ofrécese a capacidade de xerar código para funcións de envoltura integradas para instrucións vectoriales SVE.
  • Compatibilidade con procesadores Cortex-M55, Cortex-A77, Cortex-A78 e Cortex-X1 engadiuse ao backend da arquitectura ARM. Extensións implementadas
    Multiplicación matricial Armv8.6-A e RMv8.2-AA32BF16 BFloat16.

  • Engadido soporte de xeración de código para procesadores POWER10 ao backend da arquitectura PowerPC. Optimizacións de bucles estendidas e compatibilidade mellorada para operacións de punto flotante.
  • O backend para a arquitectura RISC-V pode aceptar parches con soporte para conxuntos de instrucións estendidas experimentais que aínda non foron aprobados oficialmente.
  • O backend para a arquitectura AVR pasou da categoría de experimental a estable, incluída no paquete base.
  • O backend para a arquitectura x86 admite as instrucións Intel AMX e TSXLDTRK. Engadida protección contra ataques LVI (Inxección de valor de carga), así como o mecanismo xeral de supresión de efectos secundarios de execución especulativa implícase para bloquear ataques causados ​​pola execución especulativa de operacións na CPU.
  • Engadido soporte para MemorySanitizer e LeakSanitizer no backend de SystemZ.
  • Engadiuse a Libc++ soporte para un ficheiro de cabeceira con constantes matemáticas .
  • Ampliado Capacidades do enlazador LLD. Compatibilidade mellorada do formato ELF, incluíndo a adición de "--lto-emit-asm", "--lto-todo-programa-visibilidade", "--print-archive-stats", "--shuffle-sections", "-- thinlto- single-module", "--unique", "--rosegment", "--threads=N". Engadiuse a opción "--time-trace" para gardar o rastro nun ficheiro, que despois se pode analizar a través da interface chrome://tracing en Chrome.

Fonte: opennet.ru

Engadir un comentario