Liberazione di a suite di compilatori LLVM 9.0

Dopu à sei mesi di sviluppu prisentatu liberazione di u prugettu LLVM 9.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 caratteristiche di LLVM 9.0 includenu a rimuzione di l'etichetta di cuncepimentu sperimentale da a piattaforma RISC-V di destinazione, supportu C++ per OpenCL, a capacità di split un prugramma in parti caricate dinamicamente in LLD, è l'implementazione di "asm vai", utilizatu in u codice di u kernel Linux. libc++ hà aghjustatu u supportu per WASI (WebAssembly System Interface), è LLD hà aghjustatu u supportu iniziale per u ligame dinamicu WebAssembly.

Migliuramenti in Clang 9.0:

  • Aggiuntu implementazione di l'espressione specifica GCC "asm vai", chì permette di passà da un bloccu inline di assembler à una etichetta in codice C. Questa funzione hè necessaria per custruisce u kernel Linux in u modu "CONFIG_JUMP_LABEL = y" cù Clang in sistemi cù l'architettura x86_64. In cunsiderà i cambiamenti aghjunti in versioni precedenti, u kernel Linux pò avà esse custruitu in Clang per l'architettura x86_64 (prima era supportatu solu l'edificazione per l'architetture arm, aarch64, ppc32, ppc64le è mips). Inoltre, i prughjetti Android è ChromeOS sò digià cunvertiti per utilizà Clang per a custruzione di kernel, è Google prova Clang cum'è a piattaforma principale per custruisce kernels per i so sistemi Linux di produzzione. In u futuru, altri cumpunenti LLVM ponu esse aduprati in u prucessu di creazione di u kernel, cumprese LLD, llvm-objcopy, llvm-ar, llvm-nm è llvm-objdump;
  • Aghjunghje un supportu sperimentale per aduprà C ++ 17 in OpenCL. E caratteristiche specifiche includenu u supportu per l'attributi di u spaziu di l'indirizzu, u bloccu di a cunversione di u spaziu di l'indirizzu per l'operatori di casting di tipu, a prestazione di tipi di vettori cum'è in OpenCL per C, a presenza di tipi OpenCL specifichi per l'imaghjini, avvenimenti, canali, etc.
  • Aghjunghjite novi bandieri di compilatore "-ftime-trace" è "-ftime-trace-granularity=N" per generà un rapportu nantu à u tempu di esecuzione di diverse tappe di u frontend (analisi, inizializazione) è backend (stadi di ottimisazione). U rapportu hè salvatu in formatu json, cumpatibile cù chrome://tracing è speedscope.app;
  • Prucessu aghjuntu di u specificatore "__declspec (allocatore)" è generazione di infurmazione di debugging accumpagnata chì permette di monitorà u cunsumu di memoria in l'ambiente Visual Studio;
  • Per a lingua C, u supportu hè statu aghjuntu per a macro "__FILE_NAME__", chì s'assumiglia à a macro "__FILE__", ma include solu u nome di u schedariu senza u percorsu sanu;
  • C ++ hà allargatu u supportu per l'attributi di u spaziu di l'indirizzu per copre diverse funzioni di C ++, cumprese mudelli di paràmetri è argumenti, tipi di riferimentu, inferenza di tipu di ritornu, oggetti, funzioni autogenerate, operatori integrati, è più.
  • E capacità assuciate cù u supportu per OpenCL, OpenMP è CUDA sò state allargate. Questu include u supportu iniziale per l'inclusione implicita di funzioni OpenCL integrate (a bandiera "-fdeclare-opencl-builtins" hè stata aghjunta), l'estensione cl_arm_integer_dot_product hè stata implementata, è l'arnesi di diagnosticu sò stati allargati;
  • U travagliu di l'analizzatore staticu hè statu migliuratu è a documentazione nantu à a realizazione di l'analisi statica hè stata aghjunta. Bandiere aghjunte per visualizà i moduli di verificatore dispunibili è l'opzioni supportate ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" è "-analyzer-checker[-option]-help "-sviluppatore"). Aggiunta bandiera "-analyzer-werror" per trattà l'avvirtimenti cum'è errori.
    Aggiunti novi modi di verificazione:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling per identificà pratiche insicure per travaglià cù buffers;
    • osx.MIGChecker per circà e violazioni di e regule di chjamate MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast per truvà cunversione d'ughjettu XNU libkern incorrecte;
    • apiModeling.llvm cù un inseme di funzioni di cuntrollu di mudelli per detectà errori in a basa di codice LLVM;
    • Codice stabilizatu per verificà l'uggetti C++ non inizializzati (UninitializedObject in u pacchettu optin.cplusplus);
  • L'utilità di clang-format hà aghjustatu supportu per u furmatu di u codice in a lingua C# è furnisce u supportu per u stilu di formattazione di codice utilizatu da Microsoft;
  • clang-cl, una interfaccia di linea di cummanda alternativa chì furnisce una cumpatibilità à livellu d'opzione cù u compilatore cl.exe inclusu in Visual Studio, hà aghjustatu euristiche per trattà i schedari inesistenti cum'è opzioni di linea di cumanda è mostra un avvisu currispundente (per esempiu, quandu esegue "clang-cl /diagnostic :caret /c test.cc");
  • Una grande parte di novi cuntrolli hè stata aghjunta à linter clang-tidy, cumprese cuntrolli aghjuntu specifichi à l'API OpenMP;
  • Expanded capacità di u servitore clangd (Clang Server), in u quale u modu di creazione di l'indici di fondo hè attivatu per difettu, u supportu per l'azzioni contextuale cù u codice hè statu aghjuntu (recuperazione di variabili, espansione di definizioni auto è macro, cunversione di stringhe scappate à escaped), a capacità di vede. avvirtimenti da Clang-tidy, diagnostichi allargati di l'errori in i fugliali di l'intestazione è aghjunghjenu a capacità di vede infurmazioni nantu à a ghjerarchia di tipu;

menu innovazioni LLVM 9.0:

  • Una funzione di partizione sperimentale hè stata aghjunta à u linker LLD, chì vi permette di sparte un prugramma in parechje parte, chì ognuna si trova in un schedariu ELF separatu. Sta funziunalità vi permette di lancià a parte principale di u prugramma, chì caricarà altri cumpunenti cum'è necessariu durante l'operazione (per esempiu, pudete separà u visualizatore PDF integratu in un schedariu separatu, chì caricarà solu quandu l'utilizatore apre u PDF). file).

    LLD Linker purtatu in prima à un statu adattatu per ligà u kernel Linux per l'architetture arm32_7, arm64, ppc64le è x86_64.
    Nove opzioni "-" (output à stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", "- z ifunc-noplt" è "-z common-page-size". Per l'architettura AArch64, u supportu per l'istruzzioni BTI (Branch Target Indicator) è PAC (Pointer Authentication Code) hè statu aghjuntu. U supportu per e plataforme MIPS, RISC-V è PowerPC hè statu migliuratu significativamente. Aggiuntu supportu iniziale per ligami dinamichi per WebAssembly;

  • In libc++ implementatu funzioni ssize, std::is_constant_evaluated, std::midpoint è std::lerp, i metudi "front" è "back" sò stati aghjuntu à std::span, attributi di tipi std::is_unbounded_array è std::is_bounded_array sò stati aghjunti , e capacità std sò state allargate: :atomic. U supportu per GCC 4.9 hè statu discontinuatu (pò esse usatu cù GCC 5.1 è versioni più recenti). Supportu aghjuntu WASI (WebAssembly System Interface, una interfaccia per utilizà WebAssembly fora di u navigatore);
  • Novi ottimisazioni sò state aghjunte. A cunversione attivata di e chjama memcmp à bcmp in certe situazioni. Implementazione di l'omissione di a verificazione di a gamma per i tavulini di salti in i quali i blocchi di switch inferiori sò inaccessibili o quandu l'istruzzioni ùn sò micca aduprate, per esempiu, quandu chjamanu funzioni cù u tipu void;
  • U backend per l'architettura RISC-V hè stata stabilizzata, chì ùn hè più posizionata cum'è sperimentale è hè custruitu per difettu. Fornisce un supportu cumpletu di generazione di codice per varianti di set di istruzioni RV32I è RV64I cù estensioni MAFDC;
  • Numerose migliure sò state fatte à i backend per l'architetture X86, AArch64, ARM, SystemZ, MIPS, AMDGPU è PowerPC. Per esempiu, per l'architettura
    AArch64 hà aghjustatu supportu per l'istruzzioni SVE2 (Scalable Vector Extension 2) è MTE (Memory Tagging Extensions); in u backend ARM, u supportu per l'architettura Armv8.1-M è l'estensione MVE (M-Profile Vector Extension) hè statu aghjuntu. U supportu per l'architettura GFX10 (Navi) hè statu aghjuntu à u backend AMDGPU, e funzioni di chjamà funzioni sò attivate per automaticamente, è un passu cumminatu hè attivatu. DPP (Data-Parallel Primitivi).

  • U debugger LLDB hà avà evidenziazione di culore per backtraces è aghjustatu supportu per i blocchi DWARF4 debug_types è DWARF5 debug_info;
  • U supportu per l'ughjettu è i fugliali eseguibili in u formatu COFF hè statu aghjuntu à l'utilità llvm-objcopy è llvm-strip.

Source: opennet.ru

Add a comment