Efter seks måneders udvikling præsenteret projektudgivelse LLVM 9.0 — GCC-kompatible værktøjer (kompilatorer, optimeringsværktøjer og kodegeneratorer), kompilering af programmer til mellembitcode af RISC-lignende virtuelle instruktioner (virtuel maskine på lavt niveau med et optimeringssystem på flere niveauer). Den genererede pseudokode kan konverteres ved hjælp af en JIT-kompiler til maskininstruktioner direkte på tidspunktet for programudførelse.
Nye funktioner i LLVM 9.0 inkluderer fjernelse af det eksperimentelle design-tag fra mål-RISC-V-platformen, C++-understøttelse af OpenCL, muligheden for at opdele et program i dynamisk indlæste dele i LLD og implementeringen af "asm goto", brugt i Linux-kernekoden. libc++ tilføjede understøttelse af WASI (WebAssembly System Interface), og LLD tilføjede indledende støtte til WebAssembly dynamisk linking.
Tilføjet implementering af det GCC-specifikke udtryk "asm goto", som giver dig mulighed for at flytte fra en assembler-inline-blok til en etiket i C-kode. Denne funktion er påkrævet for at bygge Linux-kernen i tilstanden "CONFIG_JUMP_LABEL=y" ved brug af Clang på systemer med x86_64-arkitektur. Under hensyntagen til ændringerne tilføjet i tidligere udgivelser, kan Linux-kernen nu bygges i Clang til x86_64-arkitekturen (tidligere blev kun bygning til armen, aarch64, ppc32, ppc64le og mips-arkitekturerne understøttet). Desuden er Android- og ChromeOS-projekter allerede blevet konverteret til at bruge Clang til kernebygning, og Google tester Clang som den vigtigste platform til at bygge kerner til sine produktions-Linux-systemer. I fremtiden kan andre LLVM-komponenter bruges i kerneopbygningsprocessen, inklusive LLD, llvm-objcopy, llvm-ar, llvm-nm og llvm-objdump;
Tilføjet eksperimentel støtte til brug af C++17 i OpenCL. Specifikke funktioner omfatter understøttelse af adresserumsattributter, blokering af adresserumskonvertering af typecasting-operatører, levering af vektortyper som i OpenCL for C, tilstedeværelsen af specifikke OpenCL-typer til billeder, begivenheder, kanaler osv.
Tilføjet nye compilerflag "-ftime-trace" og "-ftime-trace-granularity=N" for at generere en rapport om udførelsestiden for forskellige faser af frontend (parsing, initialisering) og backend (optimeringsstadier). Rapporten er gemt i json-format, kompatibel med chrome://tracing og speedscope.app;
Tilføjet behandling af "__declspec(allocator)"-specifikationen og generering af ledsagende fejlfindingsinformation, der giver dig mulighed for at overvåge hukommelsesforbrug i Visual Studio-miljøet;
For C-sproget er der tilføjet understøttelse af makroen "__FILE_NAME__", som ligner makroen "__FILE__", men kun inkluderer filnavnet uden den fulde sti;
C++ har udvidet understøttelse af adresserumsattributter til at dække forskellige C++-funktioner, herunder parameter- og argumentmønstre, referencetyper, returtypeinferens, objekter, autogenererede funktioner, indbyggede operatorer og mere.
Mulighederne forbundet med understøttelse af OpenCL, OpenMP og CUDA er blevet udvidet. Dette inkluderer indledende understøttelse af implicit inkludering af indbyggede OpenCL-funktioner (“-fdeclare-opencl-builtins”-flaget er blevet tilføjet), cl_arm_integer_dot_product-udvidelsen er blevet implementeret, og diagnostiske værktøjer er blevet udvidet;
Arbejdet med den statiske analysator er blevet forbedret, og der er tilføjet dokumentation om udførelse af statisk analyse. Tilføjede flag for at vise tilgængelige kontrolmoduler og understøttede muligheder ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" og "-analyzer-checker[-option]-help " -Udvikler"). Tilføjet "-analyzer-werror" flag for at behandle advarsler som fejl.
Tilføjet nye bekræftelsestilstande:
security.insecureAPI.DeprecatedOrUnsafeBufferHandling for at identificere usikker praksis for arbejde med buffere;
osx.MIGChecker til at søge efter overtrædelser af MIG (Mach Interface Generator) opkaldsregler;
optin.osx.OSObjectCStyleCast for at finde forkerte XNU libkern objektkonverteringer;
apiModeling.llvm med et sæt modelleringskontrolfunktioner for at opdage fejl i LLVM-kodebasen;
Stabiliseret kode til kontrol af ikke-initialiserede C++-objekter (UninitializedObject i optin.cplusplus-pakken);
Clang-format-værktøjet har tilføjet understøttelse af formatering af kode i C#-sproget og understøtter den kodeformateringsstil, der bruges af Microsoft;
clang-cl, en alternativ kommandolinjegrænseflade, der giver kompatibilitet på valgniveau med cl.exe-kompileren inkluderet i Visual Studio, har tilføjet heuristik til at behandle ikke-eksisterende filer som kommandolinjeindstillinger og vise en tilsvarende advarsel (f.eks. når du kører "clang-cl /diagnostic :caret /c test.cc");
En stor del af nye kontroller er blevet tilføjet til linter clang-tidy, herunder tilføjede kontroller, der er specifikke for OpenMP API;
Udvidet server muligheder klangd (Clang Server), hvor baggrundsindeksopbygningstilstanden er aktiveret som standard, er understøttelse af kontekstuelle handlinger med kode blevet tilføjet (variabel hentning, udvidelse af auto- og makrodefinitioner, konvertering af escapede strenge til unescapede), muligheden for at vise advarsler fra Clang-tidy, udvidet diagnostik af fejl i header-filer og tilføjet muligheden for at vise information om typehierarkiet;
En eksperimentel partitioneringsfunktion er blevet tilføjet til LLD-linkeren, som giver dig mulighed for at opdele et program i flere dele, som hver er placeret i en separat ELF-fil. Denne funktion giver dig mulighed for at starte hoveddelen af programmet, som vil indlæse andre komponenter efter behov under drift (f.eks. kan du adskille den indbyggede PDF-fremviser i en separat fil, som kun indlæses, når brugeren åbner PDF-filen fil).
LLD Linker bragt i forgrunden til en tilstand, der er egnet til at linke Linux-kernen til arm32_7, arm64, ppc64le og x86_64 arkitekturer.
Nye muligheder "-" (output til stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" og "-z almindelig sidestørrelse". For AArch64-arkitekturen er der tilføjet understøttelse af BTI (Branch Target Indicator) og PAC (Pointer Authentication Code) instruktioner. Understøttelse af MIPS-, RISC-V- og PowerPC-platforme er blevet væsentligt forbedret. Tilføjet indledende understøttelse af dynamiske links til WebAssembly;
I libc++ implementeret funktionerne ssize, std::er_konstant_evalueret, std::midpoint og std::lerp, metoderne "front" og "back" er blevet tilføjet til std::span, attributter af typer std::is_unbounded_array og std::is_bounded_array er blevet tilføjet , std-kapaciteter er blevet udvidet: :atomic. Support til GCC 4.9 er afbrudt (kan bruges med GCC 5.1 og nyere udgivelser). Tilføjet support VAR JEG (WebAssembly System Interface, en grænseflade til brug af WebAssembly uden for browseren);
Nye optimeringer er tilføjet. Aktiveret konvertering af memcmp-kald til bcmp i nogle situationer. Implementeret udeladelse af rækkeviddekontrol for springtabeller, hvor nedre kontaktblokke ikke er tilgængelige, eller når instruktioner ikke bruges, for eksempel ved opkald af funktioner med typen void;
Backend til RISC-V-arkitekturen er blevet stabiliseret, som ikke længere er placeret som eksperimentel og er bygget som standard. Giver fuld kodegenereringsunderstøttelse for RV32I og RV64I instruktionssætvarianter med MAFDC-udvidelser;
Der er lavet adskillige forbedringer til backends til X86, AArch64, ARM, SystemZ, MIPS, AMDGPU og PowerPC-arkitekturer. For eksempel til arkitektur
AArch64 tilføjede understøttelse af SVE2 (Scalable Vector Extension 2) og MTE (Memory Tagging Extensions) instruktioner; i ARM backend blev understøttelse af Armv8.1-M arkitekturen og MVE (M-Profile Vector Extension) udvidelsen tilføjet. Understøttelse af GFX10 (Navi)-arkitekturen er blevet tilføjet til AMDGPU-backend, funktionsopkaldsfunktioner er aktiveret som standard, og et kombineret pass er aktiveret DPP (Data-Parallelle Primitiver).
LLDB-debuggeren har nu farvefremhævning til backtraces og tilføjet understøttelse af DWARF4 debug_types og DWARF5 debug_info blokkene;
Understøttelse af objekt- og eksekverbare filer i COFF-format er blevet tilføjet til hjælpeprogrammerne llvm-objcopy og llvm-strip.