Release av LLVM 9.0-kompilatorpaketet

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.

Förbättringar i Clang 9.0:

  • 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;

Den huvudsakliga innovationer LLVM 9.0:

  • 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.

Källa: opennet.ru

Lägg en kommentar