Efter sex månaders utveckling presenteras projekt release LLVM 9.0 - GCC-kompatibla verktyg (kompilatorer, optimerare och kodgeneratorer) som kompilerar program till en mellanbitkod av RISC-liknande virtuella instruktioner (en virtuell dator på låg nivå med ett optimeringssystem på flera nivåer). Den genererade pseudokoden kan konverteras av JIT-kompilatorn till maskininstruktioner precis vid tidpunkten för programexekveringen.
Nya funktioner i LLVM 9.0 inkluderar borttagningen av den experimentella designtaggen från målplattformen RISC-V, C++-stöd för OpenCL, möjligheten att dela upp ett program i dynamiskt laddade delar i LLD och implementeringen av "asm goto", används i Linux-kärnkoden. libc++ lade till stöd för WASI (WebAssembly System Interface), och LLD lade till initialt stöd för WebAssembly dynamisk länkning.
Lagt till implementering av det GCC-specifika uttrycket "asm goto", som låter dig flytta från ett assembler-inlineblock till en etikett i C-kod. Den här funktionen krävs för att bygga Linux-kärnan i läget "CONFIG_JUMP_LABEL=y" med Clang på system med x86_64-arkitektur. Med hänsyn till ändringarna som lagts till i tidigare utgåvor kan Linux-kärnan nu byggas i Clang för x86_64-arkitekturen (tidigare stöddes endast byggnad för arm-, aarch64-, ppc32-, ppc64le- och mips-arkitekturen). Dessutom har Android- och ChromeOS-projekt redan konverterats för att använda Clang för att bygga kärnor, och Google testar Clang som huvudplattform för att bygga kärnor för sina Linux-produktionssystem. I framtiden kan andra LLVM-komponenter användas i kärnans byggprocess, inklusive LLD, llvm-objcopy, llvm-ar, llvm-nm och llvm-objdump;
Lade till experimentellt stöd för att använda C++17 i OpenCL. Specifika funktioner inkluderar stöd för adressutrymmesattribut, blockering av adressutrymmeskonvertering av typcast-operatorer, tillhandahållande av vektortyper som i OpenCL för C, närvaron av specifika OpenCL-typer för bilder, händelser, kanaler, etc.
Lade till nya kompilatorflaggor "-ftime-trace" och "-ftime-trace-granularity=N" för att generera en rapport om exekveringstiden för olika stadier av frontend (parsning, initiering) och backend (optimeringsstadier). Rapporten sparas i json-format, kompatibelt med chrome://tracing och speedscope.app;
Tillagd bearbetning av "__declspec(allocator)"-specifikatorn och generering av åtföljande felsökningsinformation som låter dig övervaka minnesförbrukningen i Visual Studio-miljön;
För C-språket har stöd lagts till för makrot "__FILE_NAME__", som liknar makrot "__FILE__", men bara inkluderar filnamnet utan den fullständiga sökvägen;
C++ har utökat stödet för adressutrymmesattribut för att täcka olika C++-funktioner, inklusive parameter- och argumentmönster, referenstyper, slutledning av returtyp, objekt, automatiskt genererade funktioner, inbyggda operatorer och mer.
Möjligheterna förknippade med stöd för OpenCL, OpenMP och CUDA har utökats. Detta inkluderar initialt stöd för implicit inkludering av inbyggda OpenCL-funktioner (flaggan "-fdeclare-opencl-builtins" har lagts till), tillägget cl_arm_integer_dot_product har implementerats och diagnostiska verktyg har utökats;
Arbetet med den statiska analysatorn har förbättrats och dokumentation om att utföra statisk analys har lagts till. Lade till flaggor för att visa tillgängliga kontrollmoduler och alternativ som stöds ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" och "-analyzer-checker[-option]-help " -utvecklare"). Lade till flaggan "-analyzer-werror" för att behandla varningar som fel.
Lade till nya verifieringslägen:
security.insecureAPI.DeprecatedOrUnsafeBufferHandling för att identifiera osäkra metoder för att arbeta med buffertar;
osx.MIGChecker för att söka efter överträdelser av MIG (Mach Interface Generator) anropsregler;
optin.osx.OSObjectCStyleCast för att hitta felaktiga XNU libkern-objektkonverteringar;
apiModeling.llvm med en uppsättning modelleringskontrollfunktioner för att upptäcka fel i LLVM-kodbasen;
Stabiliserad kod för att kontrollera oinitierade C++-objekt (UninitializedObject i optin.cplusplus-paketet);
Verktyget clang-format har lagt till stöd för formatering av kod i C#-språket och ger stöd för kodformateringsstilen som används av Microsoft;
clang-cl, ett alternativt kommandoradsgränssnitt som ger kompatibilitet på alternativnivå med cl.exe-kompilatorn som ingår i Visual Studio, har lagt till heuristik för att behandla icke-existerande filer som kommandoradsalternativ och visa en motsvarande varning (till exempel, när du kör "clang-cl /diagnostic :caret /c test.cc");
En stor del av nya kontroller har lagts till för att linter clang-tidy, inklusive tillagda kontroller som är specifika för OpenMP API;
Expanderat serverfunktioner clangd (Clang Server), där bakgrundsindexbyggnadsläget är aktiverat som standard, stöd för kontextuella åtgärder med kod har lagts till (variabelhämtning, utökning av auto- och makrodefinitioner, konvertering av escaped strängar till unescaped), möjligheten att visa varningar från Clang-tidy, utökad diagnostik av fel i rubrikfiler och lagt till möjligheten att visa information om typhierarkin;
En experimentell partitioneringsfunktion har lagts till i LLD-linkern, vilket gör att du kan dela upp ett program i flera delar, som var och en finns i en separat ELF-fil. Denna funktion låter dig starta huvuddelen av programmet, som kommer att ladda andra komponenter efter behov under drift (till exempel kan du separera den inbyggda PDF-visaren till en separat fil, som laddas först när användaren öppnar PDF-filen fil).
LLD Linker tog med till ett tillstånd som är lämpligt för att länka Linux-kärnan för arkitekturerna arm32_7, arm64, ppc64le och x86_64.
Nya alternativ "-" (utgång till stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" och "-z common-page-size". För AArch64-arkitekturen har stöd för instruktioner för BTI (Branch Target Indicator) och PAC (Pointer Authentication Code) lagts till. Stödet för MIPS, RISC-V och PowerPC-plattformarna har förbättrats avsevärt. Lade till initialt stöd för dynamisk länkning för WebAssembly;
I libc++ genomförs funktionerna ssize, std::is_constant_evaluated, std::midpoint och std::lerp, metoderna "front" och "back" har lagts till i std::span, attribut av typerna std::is_unbounded_array och std::is_bounded_array har lagts till , std-funktionerna har utökats: :atomic. Stödet för GCC 4.9 har upphört (kan användas med GCC 5.1 och nyare versioner). Lagt till stöd VAR JAG (WebAssembly System Interface, ett gränssnitt för att använda WebAssembly utanför webbläsaren);
Nya optimeringar har lagts till. Aktiverade konvertering av memcmp-anrop till bcmp i vissa situationer. Implementerad utelämnande av avståndskontroll för hopptabeller där nedre kopplingsblock är oåtkomliga eller när instruktioner inte används, till exempel vid anrop av funktioner med typen void;
Backend för RISC-V-arkitekturen har stabiliserats, som inte längre är placerad som experimentell och byggd som standard. Ger fullständigt kodgenereringsstöd för RV32I och RV64I instruktionsuppsättningsvarianter med MAFDC-tillägg;
Många förbättringar har gjorts av backends för X86, AArch64, ARM, SystemZ, MIPS, AMDGPU och PowerPC-arkitekturer. Till exempel för arkitektur
AArch64 lade till stöd för instruktionerna SVE2 (Scalable Vector Extension 2) och MTE (Memory Tagging Extensions), i ARM-backend, stöd för Armv8.1-M-arkitekturen och MVE-tillägget (M-Profile Vector Extension). Stöd för GFX10 (Navi)-arkitekturen har lagts till i AMDGPU-backend, funktionsanropsfunktioner är aktiverade som standard och ett kombinerat pass är aktiverat DPP (Data-Parallella Primitiver).
LLDB-debuggern har nu färgmarkering för bakåtspårning och lagt till stöd för DWARF4 debug_types och DWARF5 debug_info-blocken;
Stöd för objekt och körbara filer i COFF-format har lagts till i verktygen llvm-objcopy och llvm-strip.