Liberazione di a suite di compilatori LLVM 10.0

Dopu à sei mesi di sviluppu prisentatu liberazione di u prugettu LLVM 10.0 - Strumenti cumpatibili cù GCC (compilatori, ottimisatori è generatori di codice), cumpilendu prugrammi in codice di bit intermediu di struzzioni virtuali simili à RISC (macchina virtuale di livellu bassu cù un sistema di ottimisazione multi-livellu). U pseudocode generatu pò esse cunvertitu cù un compilatore JIT in struzzioni di a macchina direttamente à u mumentu di l'esekzione di u prugramma.

Nuvelle funzioni in LLVM 10.0 includenu supportu per i cuncetti C ++, ùn eseguisce più Clang cum'è un prucessu separatu, supportu per i cuntrolli CFG (control flow guard) per Windows, è supportu per e novi capacità di CPU.

Migliuramenti in Clang 10.0:

  • Supportu aghjuntu per "cuncetti", una estensione di mudellu C ++ chì serà inclusa in u prossimu standard, chjamatu C ++ 2a (attivatu da a bandiera -std = c ++ 2a).
    I cuncetti permettenu di definisce un inseme di paràmetri di mudelli chì, à u tempu di compilazione, limitanu l'inseme di argumenti chì ponu esse accettati cum'è paràmetri di mudelli. I cuncetti ponu esse utilizati per evità inconsistenzi lògichi trà e proprietà di i tipi di dati utilizati in u mudellu è e proprietà di u tipu di dati di i paràmetri di input.

    mudellu
    cuncettu UguaglianzaComparable = richiede (T a, T b) {
    { a == b } -> std::boolean;
    {a != b } -> std::boolean;
    };

  • Per automaticamente, u lanciamentu di un prucessu separatu ("clang -cc1") in quale a compilazione hè realizata hè fermata. A compilazione hè avà fatta in u prucessu principale, è l'opzione "-fno-integrated-cc1" pò esse usata per restaurà u vechju cumpurtamentu.
  • Novi modi di diagnosticu:
    • "-Wc99-designator" è "-Wreorder-init-list" avvisanu contra l'usu di inizializzatori C99 in modu C ++ in i casi induve sò curretti in C99 ma micca in C ++ 20.
    • "-Wsizeof-array-div" - cattura situazioni cum'è "int arr[10]; ... sizeof (arr) / sizeof (short) ..." (duverebbe esse "sizeof (arr) / sizeof (int)").
    • "-Wxor-used-as-po" - avvisa contru à l'usu di custruzzioni cum'è l'usu di l'operatore "^" (xor) in operazioni chì ponu esse cunfunditi cù l'esponenti (2^16).
    • "-Wfinal-dtor-non-final-class" - avvisa nantu à e classi chì ùn sò micca marcati cù u specifier "finale", ma anu un distruttore cù l'attributu "final".
    • "-Wtautological-bitwise-compare" hè un gruppu di avvisi per diagnosticà paraguni tautologichi trà una operazione bitwise è una constante, è per identificà paraguni sempre veri in quale l'operazione OR di bit hè applicata à un numeru micca negativu.
    • "-Wbitwise-conditional-parentheses" avvisa di prublemi quandu si mischjanu l'operatori lògichi AND (&) è OR (|) cù l'operatore cundizionale (?:).
    • "-Wmisleading-indentation" hè un analogu di u cuntrollu di u listessu nome da GCC, chì avvirtenu nantu à l'espressioni indentate cum'è s'elli sò parti di un bloccu if/else/for/while, ma in fattu ùn sò micca inclusi in stu bloccu. .
    • Quandu si specifica "-Wextra", a verificazione "-Wdeprecated-copy" hè attivata, avvistendu nantu à l'usu di custruttori
      "sposta" è "copia" in classi cù una definizione esplicita di distruttore.
    • I cuntrolli "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" sò stati allargati.
    • I cuntrolli "-Wbitwise-op-parentheses" è "-Wlogical-op-parentheses" sò disattivati ​​per difettu.
  • In u codice C è C++, l'operazioni aritmetiche di puntatore sò permesse solu in arrays. U Undefined Behavior Sanitizer in u modu "-fsanitize=pointer-overflow" ora cattura casi cum'è l'aghjunghje un offset non-zero à un puntatore nulu o creanu un puntatore nulu quandu si sottrae un interu da un puntatore non nulu.
  • U modu "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) hè adattatu per identificà i prublemi cù l'operazione d'incrementu è di decrementu per i tipi cù una dimensione di pocu più chjuca di quella di u tipu "int".
  • Quandu selezziunate l'architetture di destinazione x86 "-march = skylake-avx512", "-march = icelake-client", "-march = icelake-server", "-march = cascadelake" è "-march = cooperlake" per difettu in u vectorized The u codice hà cessatu di utilizà registri zmm 512-bit, eccettu per a so indicazione diretta in u codice fonte. U mutivu hè chì a freccia di CPU diminuite quandu eseguisce operazioni di 512-bit, chì ponu influenzà negativamente u rendiment generale. Per cambià u novu cumpurtamentu, l'opzione "-mprefer-vector-width=512" hè furnita.
  • U cumpurtamentu di a bandiera "-flax-vector-conversions" hè simile à GCC: cunversione di bit vettoriale implicita trà vettori integer è in virgola flottante hè pruibita. Per eliminà sta limitazione, hè prupostu di utilizà a bandiera
    "-flax-vector-conversions=all" chì hè u predefinitu.
  • Supportu migliuratu per i CPU MIPS di a famiglia Octeon. Aggiuntu "octeon +" à a lista di tipi di CPU validi.
  • Quandu si assemble in u codice intermediu WebAssembly, l'ottimisatore wasm-opt hè chjamatu automaticamente, se dispunibule in u sistema.
  • Per i sistemi basati nantu à l'architettura RISC-V, l'usu di registri chì almacenanu i valori in virgule flottante hè permessu in blocchi cundiziunali di inserti in linea di assembler.
  • Aggiunti novi bandieri di compilatore: "-fgnuc-version" per stabilisce u valore di versione per "__GNUC__" è macros simili; "-fmacro-prefix-map=OLD=NEW" per rimpiazzà u prefissu di u repertoriu OLD cù NEW in macros such as "__FILE__"; "-fpatchable-function-entry=N[,M]" per generà un certu numaru d'istruzzioni NOP prima è dopu à u puntu di entrata di a funzione. Per RISC-V
    aghjustatu supportu per i bandieri "-ffixed-xX", "-mcmodel=medany" è "-mcmodel=medlow".
  • Aghjunghje supportu per l'attributu '__attribute__((target ("branch-protection =..."))), l'effettu di quale hè simile à l'opzione -branch-prutezzione.
  • Nant'à a piattaforma Windows, quandu si specifica a bandiera "-cfguard", a sostituzione di i cuntrolli di integrità di u flussu di esecuzione (Guarda di u flussu di cuntrollu) per e chjama di funzione indiretta hè implementata. Per disattivà a sustituzione di cuntrollu, pudete aduprà a bandiera "-cfguard-nochecks" o u modificatore "__declspec(guard(nocf))".
  • U cumpurtamentu di l'attributu gnu_inline hè simile à GCC in i casi induve hè utilizatu senza a chjave "extern".
  • E capacità assuciate cù u supportu OpenCL è CUDA sò state allargate. Aghjunghje supportu per e novi funzioni OpenMP 5.0.
  • Una opzione Standard hè stata aghjunta à l'utilità di clang-format, chì vi permette di determinà a versione di u standard C ++ utilizatu per l'analisi è u furmatu di u codice (Latest, Auto, c ++ 03, c ++ 11, c ++ 14, c++17, c++20).
  • Nuvelli cuntrolli sò stati aghjunti à l'analizzatore staticu: alpha.cplusplus.PlacementNew per determinà s'ellu ci hè abbastanza spaziu di almacenamento, fuchsia.HandleChecker per detectà fughe ligati à fucsia handlers, security.insecureAPI.decodeValueOfObjCType per detectà potenziale buffer overflows quandu si usa [NSCoder decodebValueypefObjCTypef. : à :] .
  • U Undefined Behavior Sanitizer (UBSan) hà allargatu i so cuntrolli di overflow di puntatore per catturà l'applicazione di offsets non zero à i puntatori NULL o l'aghjunzione risultante di un offset di puntatore NULL.
  • In linter clang-tidy aghjustatu una grande parte di novi cuntrolli.

menu innovazioni LLVM 10.0:

  • À u quadru Attributore Novi ottimisazioni interprocedurali è analizatori sò stati aghjuntu. U statu di 19 attributi diffirenti hè previstu, cumprese 12 attributi 12 LLVM IR è 7 attributi astratti cum'è a vita.
  • Aghjunghjite novi funzioni matematiche matrici integrate in u compilatore (Intrinseci), chì sò rimpiazzati da struzzioni vettoriali efficienti durante a compilazione.
  • Numerose migliure sò state fatte à i backend per l'architetture X86, AArch64, ARM, SystemZ, MIPS, AMDGPU è PowerPC. Aggiuntu supportu CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 è Neoverse N1. Per ARMv8.1-M, ​​u prucessu di generazione di codice hè stata ottimizzata (per esempiu, hè apparsu u supportu per i loops cù un minimu overhead) è u supportu per l'autovectorization hè statu aghjuntu cù l'estensione MVE. Supportu CPU MIPS Octeon mejoratu. Per PowerPC, a vectorizazione di subrutine matematiche cù a biblioteca MASSV (Mathematical Acceleration SubSystem) hè attivata, a generazione di codice hè migliurata, è l'accessu di memoria da i loops hè ottimizatu. Per x86, a gestione di i tipi di vettori v2i32, v4i16, v2i16, v8i8, v4i8 è v2i8 hè stata cambiata.
  • Generatore di codice migliuratu per WebAssembly. Aghjunghje supportu per TLS (Thread-Local Storage) è istruzioni atomic.fence. U supportu SIMD hè statu allargatu significativamente. I schedarii di l'ughjettu WebAssembly anu avà a capacità di utilizà signatures di funzione multi-valore.
  • L'analizzatore hè utilizatu durante u processu di loops Memoria SSA, chì permette di definisce dipendenze trà e diverse operazioni di memoria. MemorySSA pò riduce u tempu di compilazione è esecutivu o pò esse usatu invece di AliasSetTracker senza perdita di rendiment.
  • U debugger LLDB hà migliuratu significativamente u supportu per u formatu DWARF v5. Supportu migliuratu per a custruzione cù MinGW
    è aghjustatu capacità iniziale per debug eseguibili Windows per architetture ARM è ARM64. Aghjunghjite descrizzioni di l'opzioni offerte quandu si cumpleta automaticamente l'input pressendu a tabulazione.
  • Expanded Capacità di linker LLD. Un supportu migliuratu per u formatu ELF, cumpresu a cumpatibilità cumpleta di i mudelli glob cù u linker GNU, aghjunghjendu supportu per e sezioni di debug cumpressi ".zdebug", aghjunghjendu a pruprietà PT_GNU_PROPERTY per definisce a sezione .note.gnu.property (pò esse usata in u futuru). kernel Linux),
    I modi "-z noseparate-code", "-z separate-code" è "-z separate-loadable-segments" sò stati implementati. Supportu migliuratu per MinGW è WebAssembly.

Source: opennet.ru