Udgivelse af LLVM 9.0 compiler suite

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.

Forbedringer i Clang 9.0:

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

The main innovationer LLVM 9.0:

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

Kilde: opennet.ru

Tilføj en kommentar