Liberazione di a suite di compilatori LLVM 16.0

Dopu à sei mesi di sviluppu, a liberazione di u prughjettu LLVM 16.0 hè presentata - un toolkit compatibile cù GCC (compilatori, ottimizzatori è generatori di codice) chì compila i prugrammi in un bitcode intermediu di struzzioni virtuali simili à RISC (una macchina virtuale di livellu bassu cù un sistema di ottimisazione multi-livellu). U pseudo-codice generatu pò esse cunvertitu da u compilatore JIT in istruzzioni di a macchina ghjustu à u mumentu di l'esekzione di u prugramma.

Principali miglioramenti in Clang 16.0:

  • U standard C++/ObjC++ predefinitu hè gnu++17 (precedentemente gnu++14), chì significa chì e funzioni C++17 cù estensioni GNU sò supportate per difettu. Per rinvià u cumpurtamentu precedente, pudete aduprà l'opzione "-std=gnu++14".
  • Funzioni avanzate implementate in relazione à u standard C++ 20:
    • Funzioni di membri speciali cundizionalmente triviali,
    • catturare legami strutturati in funzioni lambda,
    • Operatore di uguaglianza in l'espressioni,
    • Opzione per omette a keyword typename in certi cuntesti,
    • Inizializazione aggregata valida in parentesi ("Aggr(val1, val2)").
  • E caratteristiche definite in u futuru standard C++ 2b sò state implementate:
    • Hè permessu di mette etichette à a fine di l'espressioni cumposti,
    • operatore staticu (),
    • operatore staticu [],
    • A cumpatibilità cù u tippu char8_t hè assicurata,
    • A gamma di caratteri permessa per l'usu in "\N{...}" hè stata allargata
    • Aggiunta l'abilità di utilizà variabili dichjarate cum'è "static constexpr" in funzioni dichjarate cum'è constexpr.
  • E caratteristiche definite in u futuru C-standard C2x sò state implementate:
    • Per disattivà l'avvisu "-Wunused-label", l'attributu "[[maybe_unused]]" hè permessu di esse applicatu à l'etichette
    • Hè permessu di mette etichette in ogni locu in l'espressioni cumposti,
    • Aggiunti operatori typeof è typeof_unqual,
    • Un novu tipu nullptr_t è una constante nullptr per definisce punters nulli chì ponu cunvertisce à qualsiasi tipu di puntatore è rapprisentanu una variante di NULL chì ùn hè micca ligata à i tipi integer è void *.
    • In u modu C2x, chjamà a macro va_start cù un numeru variabile di argumenti (variadic) hè permessu.
  • In i modi di cunfurmità C99, C11 è C17, l'opzioni predeterminate "-Wimplicit-function-declaration" è "-Wimplicit-int" producenu avà un errore invece di un avvisu.
  • L'usu indirettu di "void *" (per esempiu "void func(void *p) { *p; }") in u modu C++ genera avà un errore, simile à ISO C++, GCC, ICC è MSVC.
  • Specificà i campi di bit cum'è operandi d'istruzzioni (per esempiu "__asm ​​​​{mov eax, s.bf }") in blocchi di assemblea in linea in stile Microsoft genera avà un errore.
  • Aghjunghjite diagnostichi per a presenza di diverse strutture è unioni cù i stessi nomi in diversi moduli.
  • E capacità assuciate cù u supportu OpenCL è OpenMP sò state allargate. Diagnostica mejorata per i mudelli C++ utilizati in l'argumenti di u kernel OpenCL. Supportu di bloccu di fila mejoratu per AMDGPU. L'attributu nounwind hè implicitamente aghjuntu à tutte e funzioni. Supportu migliuratu per e funzioni integrate.
  • Aggiunta l'abilità di utilizà a variabile d'ambiente CLANG_CRASH_DIAGNOSTICS_DIR per definisce u repertoriu in quale i dati di diagnosticu di crash sò salvati.
  • U supportu Unicode hè statu aghjurnatu à a specificazione Unicode 15.0. Certi simboli matematichi sò permessi in identificatori, cum'è "₊" (per esempiu, "double xₖ₊₁").
  • Aghjunghje supportu per a carica di parechji schedarii di cunfigurazione (i schedarii di cunfigurazione predeterminati sò caricati prima, è dopu quelli specificati via a bandiera "--config=", chì pò avà esse specificatu parechje volte). Cambiatu l'ordine di carica predeterminatu di i schedarii di cunfigurazione: clang prova di carica u schedariu prima - .cfg, è s'ellu ùn hè micca trovu prova à carricà dui schedari .cfg è .cfg. Per disattivà a carica di i fugliali di cunfigurazione per automaticamente, a bandiera "--no-default-config" hè stata aghjunta.
  • Per assicurà e custruzzioni ripetibili, hè pussibule rimpiazzà i valori di data è ora attuale in i macros __DATE__, __TIME__ è __TIMESTAMP__ cù l'ora specificata in a variabile d'ambiente SOURCE_DATE_EPOCH.
  • Per verificà e funzioni integrate (builtin) chì ponu esse aduprate in u cuntestu di custanti, a macro "__has_constexpr_builtin" hè stata aghjunta.
  • Aggiunta una nova bandiera di compilazione "-fcoro-aligned-allocation" per l'attribuzione di frame coroutine allineatu.
  • A bandiera "-fstrict-flex-arrays=" implementa u supportu per u terzu livellu di verificazione di elementi di array flexible in strutture (Flexible Array Members, un array di dimensione indefinita à a fine di a struttura). À u terzu livellu, solu a dimensione "[]" (per esempiu, "int b[]") hè trattata cum'è un array flexible, ma a dimensione "[0]" (per esempiu, "int b[0]") ùn hè micca.
  • Aggiunta a bandiera "-fmodule-output" per attivà u mudellu di compilazione in una sola fase per i moduli C++ standard.
  • Aggiuntu u modu "-Rpass-analysis=stack-frame-layout" per aiutà à diagnosticà i prublemi cù u layout di stack frame.
  • Aggiuntu un novu attributu __attribute__((target_version("cpu_features")))) è estendu a funziunalità di l'attributu __attribute__((target_clones("cpu_features1","cpu_features2",...)))) per selezziunà versioni specifiche di funzioni furnite da AArch64 CPU.
  • Strumenti di diagnostichi sviluppati:
    • Avvisu aghjustatu "-Wsingle-bit-bitfield-constant-conversion" per detectà u truncamentu implicitu quandu l'assignate unu à un bitfield signatu à un bit.
    • U diagnosticu di variabili constexpr non inizializzati hè statu allargatu.
    • Aghjunghjite avvisi "-Wcast-function-type-strict" è "-Wincompatible-function-pointer-types-strict" per identificà i prublemi potenziali cù u casting di u tipu di funzione.
    • Diagnosticu aghjuntu per l'usu di nomi di moduli sbagliati o riservati in blocchi di esportazione.
    • Rilevazione mejorata di e parolle chjave "auto" mancanti in e definizione.
    • L'implementazione di l'avvisu "-Winteger-overflow" hà aghjustatu cuntrolli per situazioni supplementari chì portanu à overflows.
  • Supportu implementatu per l'architettura di l'istruzzioni LoongArch (-march=loongarch64 o -march=la464), utilizatu in i processori Loongson 3 5000 è implementendu u novu RISC ISA, simile à MIPS è RISC-V.

Innuvazioni chjave in LLVM 16.0:

  • U codice LLVM hè permessu di utilizà elementi definiti in u standard C++ 17.
  • I requisiti ambientali per a custruzione di LLVM sò stati aumentati. L'arnesi di custruzzione devenu avà sustene u standard C++ 17, i.e. Per custruisce, avete bisognu di almenu GCC 7.1, Clang 5.0, Apple Clang 10.0 o Visual Studio 2019 16.7.
  • U backend per l'architettura AArch64 aghjunghjenu supportu per i CPU Cortex-A715, Cortex-X3 è Neoverse V2, assembler per RME MEC (Memory Encryption Contexts), estensioni Armv8.3 (Number Complex) è Function Multi Versioning.
  • In u backend per l'architettura ARM, u supportu per e plataforme di destinazione Armv2, Armv2A, Armv3 è Armv3M hè statu discontinuatu, per quale a generazione di codice currettu ùn era micca garantitu. Aggiunta a capacità di generà codice per struzzioni per travaglià cù numeri cumplessi.
  • U backend per l'architettura X86 hà aghjustatu supportu per l'architetture di istruzzioni (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Aggiuntu supportu per RDMSRLIST, RMSRLIST è WRMSRNS instructions. Opzioni implementate "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" è "-mcpu=grandridge".
  • Aggiuntu supportu ufficiale per a piattaforma LoongArch.
  • Backends migliorati per architetture MIPS, PowerPC è RISC-V
  • Aghjunghje supportu per debugging executables 64-bit per l'architettura LoongArch à u debugger LLDB. A gestione megliu di i simboli di debug COFF. Furnitu filtrazione di DLL duplicate in a lista di moduli Windows caricati.
  • In a libreria Libc++, u travagliu principale hè stata focu annantu à l'implementazione di supportu per e funzioni novi di i standard C++20 è C++23.
  • U linker LDD riduce significativamente u tempu di ligame parallelisendu a scansione di trasferimentu di l'indirizzu è l'operazione di inizializazione di sezione. Aghjunghje supportu per a compressione di a sezione cù l'algoritmu ZSTD.

Source: opennet.ru

Add a comment