Llançament del conjunt de compiladors LLVM 22

Després de sis mesos de desenvolupament, s'ha publicat LLVM 22.1.0. Desenvolupa eines (compiladors, optimitzadors i generadors de codi) que compileu programes en codi de bits intermedi d'instruccions virtuals tipus RISC (una màquina virtual de baix nivell amb un sistema d'optimització multinivell). El pseudocodi generat es pot convertir en codi màquina per a una plataforma de destinació determinada o utilitzar-lo un compilador just-in-time (JIT) per generar instruccions màquina directament durant l'execució del programa. Basant-se en les tecnologies LLVM, el projecte està desenvolupant el compilador Clang, que admet els llenguatges de programació C, C++ i Objective-C. A partir de la branca 18.x, el projecte va canviar a un nou esquema de numeració de versions, segons el qual s'utilitza la versió 0 ("N.0") durant el desenvolupament i la primera versió estable es numera com a "N.1".

Les millores a Clang 22 inclouen:

  • S'ha afegit compatibilitat amb els tokens d'assignació de memòria (Allocation Tokens) per marcar les operacions d'assignació de memòria realitzades mitjançant funcions com ara malloc amb un identificador únic. Els tokens d'assignació permeten estructurar la informació del heap, simplificar la detecció de fuites de memòria i habilitar l'agrupació d'objectes segons el seu propòsit o patrons de modificació (per exemple, separar les dades "calentes" de les "fredes"). Per habilitar-ho, utilitzeu el senyalador "-fsanitize=alloc-token".
  • Característiques relacionades amb el llenguatge C:
    • S'ha implementat un esborrany d'especificació que defineix el mecanisme d'execució ajornada "defer", que permet executar accions quan l'àmbit actual finalitza. S'ha afegit el senyalador "-fdefer-ts" per habilitar la compatibilitat amb "defer".
    • S'ha afegit la funció integrada __builtin_stack_address(), que imita la funció similar de GCC. Aquesta funció retorna l'adreça de pila separant l'àrea de pila de la funció actual que ha cridat __builtin_stack_address() i les funcions posteriors que crida.
  • Capacitats que s'estan desenvolupant per al futur estàndard C2y:
    • S'ha afegit compatibilitat amb bucles amb nom, que permet assignar noms a bucles i instruccions switch, que es poden especificar a les instruccions break i continue per definir explícitament el bucle del qual sortir. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // vés a CONT1 continue outer; // vés a CONT2 // CONT1 } // CONT2 }
    • La implementació de la macro "__COUNTER__" integrada, dissenyada per generar noms d'identificadors únics, s'ha ampliat i s'ha inclòs a l'estàndard. S'ha establert un límit de 2147483647 crides a aquesta macro; si es supera aquest límit, es generarà un error.
    • S'ha eliminat l'advertència (-Wstatic-in-inline) en utilitzar funcions o variables estàtiques dins de funcions declarades com a "extern inline".
  • Capacitats definides a l'estàndard C23 C:
    • El fitxer d'encapçalament float.h ara admet les macros FLT_SNAN, DBL_SNAN i LDBL_SNAN, que implementen valors NaN senyalitzats (que provoquen una excepció quan s'utilitzen en operacions aritmètiques) per a tipus float, double i long double.
    • S'ha corregit un error que feia que diferents tipus sense nom es tractessin com a compatibles dins de la mateixa unitat de traducció si tenien els mateixos camps.
    • El senyalador "-MG" que s'utilitza per ignorar els fitxers d'encapçalament que falten durant l'escaneig de dependències s'ha ampliat a les directives "#embed" i ara suprimeix l'error "fitxer no trobat" quan falta un fitxer especificat en una directiva "#embed".
  • Característiques relacionades amb C++:
    • S'ha afegit la capacitat d'utilitzar enllaços estructurats en el context "constexpr", tal com es va desenvolupar a l'especificació C++2c (C++26). Això significa que les referències a expressions constants ara poden ser elles mateixes expressions constants. S'ha implementat compatibilitat amb matrius i estructures simples (les tuples encara no són compatibles). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • Tal com exigeix ​​l'estàndard C++20, les restriccions ara es converteixen a la forma estàndard abans de ser comprovades, cosa que permet missatges de diagnòstic més precisos i una gestió adequada dels errors de substitució en arguments de plantilla que només s'utilitzen en els identificadors de concepte.
    • S'ha afegit una família de funcions integrades "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" per esbrinar si els operadors de comparació "<", ">", "<=" i ">=" s'han sintetitzat a partir de l'operador "<=>".
    • El paràmetre "-Wincompatible-pointer-types" s'ha canviat per mostrar un error en comptes d'un avís. Per tornar al comportament anterior, utilitzeu l'opció "-Wno-error=incompatible-pointer-types".
  • S'han afegit les funcions integrades __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter i __builtin_dedup_pack. Per exemple, builtin_dedup_pack permet eliminar duplicats d'una llista de tipus: utilitzant MyTypeList = TypeList<__builtin_dedup_pack …>; // el tipus resultant serà TypeList
  • Quan es depura un comportament indefinit amb UBSan (-fsanitize=undefined -fsanitize-trap=undefined), ara s'inclou la informació de la causa de l'error a la informació de depuració generada. S'ha afegit el senyalador "-fsanitize-debug-trap-reasons" per especificar el nivell de detall de la informació d'error. Es pot establir com a "bàsic" per a descripcions generals (per exemple, "Desbordament de la suma d'enters") i com a "detallat" per incloure informació detallada (per exemple, "desbordament de la suma d'enters amb signe a 'a + b'").
  • S'han afegit nous indicadors del compilador:
    • "-f[no-]sanitize-debug-trap-reasons" per controlar si els motius de les excepcions de trampa s'incrusten a la informació de depuració quan es compila amb el mode "-fsanitize-trap".
    • "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" i "-fsanitize-alloc-token-extended" per gestionar els tokens d'assignació de memòria.
    • "-fmatrix-memory-layout" per controlar la disposició de memòria dels tipus de matriu (per exemple, columna-major per a columna-major, fila-major per a fila-major).
  • Les funcions ara tenen un atribut "malloc_span", similar a l'atribut malloc però aplicable a funcions que retornen estructures tipus span que contenen un punter i un camp amb la mida o un punter al final del bloc.
  • S'ha afegit l'atribut "modular_format" per seleccionar dinàmicament la implementació enllaçada estàticament necessària de la funció printf en el moment de l'enllaç.
  • S'han ampliat les eines de diagnòstic i anàlisi estàtica, i s'han afegit noves comprovacions (diverses dotzenes de millores relacionades amb el diagnòstic).
  • S'han afegit intrínseques addicionals per a les extensions SSE, AVX i AVX512 al backend X86. S'han afegit modes de compilació per a CPU Intel basades en les microarquitectures Wildcat Lake (-march=wildcatlake) i Nova Lake (-march=novalake).
  • El backend AArch64 ara admet els processadors Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) i Arm C1-Ultra (c1-ultra). S'han afegit funcions integrades addicionals per a les instruccions FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] i FCVTA[US]. S'ha estabilitzat la compatibilitat amb la multiversió de funcions (FMV). Els usuaris ara poden anul·lar la prioritat de diferents versions de funcions.
  • S'ha afegit compatibilitat amb l'arquitectura LoongArch32 (LA32R, LA32S).
  • Backends millorats per a les arquitectures ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly i PowerPC.

Font: opennet.ru

Compreu allotjament fiable per a llocs amb protecció DDoS, servidors VPS VDS 🔥 Compra allotjament web fiable amb protecció DDoS, servidors VPS VDS | ProHoster