Lanzamento do paquete de compiladores LLVM 10.0

Despois de seis meses de desenvolvemento presentado lanzamento do proxecto LLVM 10.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.

As novas funcións de LLVM 10.0 inclúen soporte para conceptos C++, xa non se executa Clang como un proceso separado, soporte para comprobacións de CFG (protección de fluxo de control) para Windows e soporte para novas capacidades da CPU.

Melloras en Clang 10.0:

  • Engadiuse soporte para "conceptos", unha extensión de modelo C++ que se incluirá no seguinte estándar, con nome en código C++2a (activada pola marca -std=c++2a).
    Os conceptos permiten definir un conxunto de requisitos de parámetros de modelo que, no momento da compilación, limitan o conxunto de argumentos que se poden aceptar como parámetros de modelo. Os conceptos pódense utilizar para evitar inconsistencias lóxicas entre as propiedades dos tipos de datos utilizados dentro do modelo e as propiedades dos tipos de datos dos parámetros de entrada.

    modelo
    concepto IgualdadeComparable = require(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • De xeito predeterminado, deténse o lanzamento dun proceso separado ("clang -cc1") no que se realiza a compilación. A compilación faise agora no proceso principal e pódese usar a opción "-fno-integrated-cc1" para restaurar o comportamento antigo.
  • Novos modos de diagnóstico:
    • "-Wc99-designator" e "-Wreorder-init-list" advirten contra o uso de inicializadores C99 en modo C++ nos casos en que sexan correctos en C99 pero non en C++20.
    • "-Wsizeof-array-div" - captura situacións como "int arr[10]; ...sizeof(arr) / sizeof(short)..." (debe ser "sizeof(arr) / sizeof(int)").
    • "-Wxor-used-as-po" - advirte contra o uso de construcións como o uso do operador "^" (xor) en operacións que se poden confundir coa exponenciación (2^16).
    • "-Wfinal-dtor-non-final-class" - advirte sobre as clases que non están marcadas co especificador "final", pero que teñen un destrutor co atributo "final".
    • "-Wtautological-bitwise-compare" é un grupo de avisos para diagnosticar comparacións tautolóxicas entre unha operación bit a bit e unha constante, e para identificar comparacións sempre verdadeiras nas que a operación OR bit a bit se aplica a un número non negativo.
    • "-Wbitwise-conditional-parentheses" advirte de problemas ao mesturar os operadores lóxicos AND (&) e OU (|) co operador condicional (?:).
    • "-Wmisleading-indentation" é un análogo da verificación do mesmo nome de GCC, que advirte sobre expresións sangradas como se formasen parte dun bloque if/else/for/while, pero de feito non están incluídas neste bloque .
    • Ao especificar "-Wextra", a comprobación "-Wdeprecated-copy" está habilitada, avisando sobre o uso de construtores
      "mover" e "copiar" nas clases cunha definición explícita de destrutor.

    • Ampliáronse as comprobacións "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis".
    • As comprobacións "-Wbitwise-op-parentheses" e "-Wlogical-op-parentheses" están desactivadas por defecto.
  • No código C e C++, só se permiten operacións aritméticas de punteiros en matrices. O Undefined Behavior Sanitizer no modo "-fsanitize=pointer-overflow" agora detecta casos como engadir unha compensación distinta de cero a un punteiro nulo ou crear un punteiro nulo ao restar un enteiro dun punteiro non nulo.
  • O modo "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) está adaptado para identificar problemas coas operacións de incremento e decremento para tipos cun tamaño de bit menor que o do tipo "int".
  • Ao seleccionar arquitecturas de destino x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" e "-march=cooperlake" por defecto en formato vectorizado. o código deixou de usar rexistros zmm de 512 bits, agás a súa indicación directa no código fonte. O motivo é que a frecuencia da CPU diminúe cando se realizan operacións de 512 bits, o que pode afectar negativamente o rendemento xeral. Para cambiar o novo comportamento, ofrécese a opción "-mprefer-vector-width=512".
  • O comportamento da marca "-flax-vector-conversions" é semellante ao GCC: as conversións de bits vectoriais implícitos entre vectores enteiros e de coma flotante están prohibidas. Para eliminar esta limitación, proponse utilizar a bandeira
    "-flax-vector-conversions=all" que é o valor predeterminado.

  • Compatibilidade mellorada para as CPU MIPS da familia Octeon. Engadiuse "octeon+" á lista de tipos de CPU válidos.
  • Cando se ensambla no código intermedio de WebAssembly, chámase automaticamente ao optimizador wasm-opt, se está dispoñible no sistema.
  • Para sistemas baseados na arquitectura RISC-V, permítese o uso de rexistros que almacenan valores de coma flotante en bloques condicionais de insercións en liña do ensamblador.
  • Engadíronse novas marcas do compilador: "-fgnuc-version" para establecer o valor da versión para "__GNUC__" e macros similares; "-fmacro-prefix-map=OLD=NEW" para substituír o prefixo do directorio OLD por NEW en macros como "__FILE__"; "-fpatchable-function-entry=N[,M]" para xerar un certo número de instrucións NOP antes e despois do punto de entrada da función. Para RISC-V
    engadiu soporte para as bandeiras "-ffixed-xX", "-mcmodel=medany" e "-mcmodel=medlow".

  • Engadiuse compatibilidade para o atributo '__attribute__((target ("branch-protection=..."))), cuxo efecto é semellante ao da opción -protección de ramificación.
  • Na plataforma Windows, ao especificar a marca "-cfguard", implícase a substitución das comprobacións de integridade do fluxo de execución (Control Flow Guard) polas chamadas indirectas de funcións. Para desactivar a substitución de comprobacións, pode usar a marca "-cfguard-nochecks" ou o modificador "__declspec(guard(nocf))".
  • O comportamento do atributo gnu_inline é semellante ao GCC nos casos en que se usa sen a palabra clave "extern".
  • Ampliáronse as capacidades asociadas co soporte de OpenCL e CUDA. Engadido soporte para novas funcións de OpenMP 5.0.
  • Engadiuse unha opción Estándar á utilidade clang-format, que lle permite determinar a versión do estándar C++ que se usa ao analizar e formatar o código (Último, Automático, c++03, c++11, c++14, c++17, c++20).
  • Engadíronse novas comprobacións ao analizador estático: alpha.cplusplus.PlacementNew para determinar se hai espazo de almacenamento suficiente, fuchsia.HandleChecker para detectar fugas relacionadas cos controladores Fuchsia, security.insecureAPI.decodeValueOfObjCType para detectar posibles desbordamentos de búfer cando se utiliza [NSCoder decodebValueObjCTypeOf :at:] .
  • O Undefined Behavior Sanitizer (UBSan) ampliou as súas comprobacións de desbordamento de punteiros para detectar a aplicación de compensacións distintas de cero a punteiros NULL ou a adición resultante dun desplazamento de punteiro NULL.
  • En linter clang-tidy engadido gran parte dos novos cheques.

O principal innovacións LLVM 10.0:

  • Ao marco Atributor Engadíronse novas optimizacións e analizadores interprocedementais. Predícese o estado de 19 atributos diferentes, incluíndo 12 atributos, 12 LLVM IR e 7 atributos abstractos como a vivacidade.
  • Engadíronse novas funcións matemáticas matriciales integradas no compilador (intrínsecos), que son substituídas por instrucións vectoriais eficientes durante a compilación.
  • Realizáronse numerosas melloras nos backends para as arquitecturas X86, AArch64, ARM, SystemZ, MIPS, AMDGPU e PowerPC. Engadido soporte de CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 e Neoverse N1. Para ARMv8.1-M, ​​o proceso de xeración de código foi optimizado (por exemplo, apareceu soporte para bucles cunha sobrecarga mínima) e engadiuse soporte para a vectorización automática mediante a extensión MVE. Compatibilidade con CPU MIPS Octeon mellorada. Para PowerPC, a vectorización de subrutinas matemáticas mediante a biblioteca MASSV (Mathematical Acceleration SubSystem) está habilitada, mellórase a xeración de código e optimízase o acceso á memoria desde bucles. Para x86, cambiouse o manexo dos tipos de vectores v2i32, v4i16, v2i16, v8i8, v4i8 e v2i8.

  • Xerador de código mellorado para WebAssembly. Engadiuse soporte para TLS (Thread-Local Storage) e instrucións atomic.fence. O soporte SIMD ampliouse significativamente. Os ficheiros de obxectos de WebAssembly agora teñen a capacidade de usar sinaturas de funcións de varios valores.
  • O analizador úsase ao procesar bucles MemoriaSSA, que permite definir dependencias entre diferentes operacións de memoria. MemorySSA pode reducir o tempo de compilación e execución ou pode usarse en lugar de AliasSetTracker sen perda de rendemento.
  • O depurador LLDB mellorou significativamente o soporte para o formato DWARF v5. Compatibilidade mellorada para construír con MinGW
    e engadiu a capacidade inicial para depurar os executables de Windows para arquitecturas ARM e ARM64. Engadíronse descricións das opcións que se ofrecen ao completar automaticamente a entrada premendo a tabulación.

  • Ampliado Capacidades do enlazador LLD. Compatibilidade mellorada para o formato ELF, incluíndo a garantía de compatibilidade total dos modelos glob co enlazador GNU, engadindo soporte para seccións de depuración comprimidas ".zdebug", engadindo a propiedade PT_GNU_PROPERTY para definir a sección .note.gnu.property (pódese usar no futuro). núcleos de Linux),
    Implementáronse os modos "-z noseparate-code", "-z separate-code" e "-z segmentos-separados-cargables". Compatibilidade mellorada para MinGW e WebAssembly.

Fonte: opennet.ru

Engadir un comentario