Utgivelse av LLVM 9.0-kompilatorpakken

Etter seks måneder med utvikling presentert prosjektutgivelse LLVM 9.0 — GCC-kompatible verktøy (kompilatorer, optimerere og kodegeneratorer), kompilering av programmer til mellombitkode for RISC-lignende virtuelle instruksjoner (virtuell maskin på lavt nivå med et optimaliseringssystem på flere nivåer). Den genererte pseudokoden kan konverteres ved hjelp av en JIT-kompilator til maskininstruksjoner direkte på tidspunktet for programkjøring.

Nye funksjoner i LLVM 9.0 inkluderer fjerning av den eksperimentelle design-taggen fra mål-RISC-V-plattformen, C++-støtte for OpenCL, muligheten til å dele et program i dynamisk lastede deler i LLD, og ​​implementeringen av "asm gå", brukt i Linux-kjernekoden. libc++ la til støtte for WASI (WebAssembly System Interface), og LLD la til startstøtte for WebAssembly dynamisk kobling.

Forbedringer i Clang 9.0:

  • La til implementering av det GCC-spesifikke uttrykket "asm gå", som lar deg flytte fra en assembler inline-blokk til en etikett i C-kode. Denne funksjonen er nødvendig for å bygge Linux-kjernen i "CONFIG_JUMP_LABEL=y"-modus ved å bruke Clang på systemer med x86_64-arkitektur. Tatt i betraktning endringene som er lagt til i tidligere utgivelser, kan Linux-kjernen nå bygges i Clang for x86_64-arkitekturen (tidligere ble kun bygning for arm, aarch64, ppc32, ppc64le og mips-arkitekturen støttet). Dessuten har Android- og ChromeOS-prosjekter allerede blitt konvertert til å bruke Clang for kjernebygging, og Google tester Clang som hovedplattformen for å bygge kjerner for sine produksjons-Linux-systemer. I fremtiden kan andre LLVM-komponenter brukes i kjernebyggeprosessen, inkludert LLD, llvm-objcopy, llvm-ar, llvm-nm og llvm-objdump;
  • Lagt til eksperimentell støtte for bruk av C++17 i OpenCL. Spesifikke funksjoner inkluderer støtte for adresseromsattributter, blokkering av adresseromkonvertering av typecasting-operatører, levering av vektortyper som i OpenCL for C, tilstedeværelsen av spesifikke OpenCL-typer for bilder, hendelser, kanaler, etc.
  • Lagt til nye kompilatorflagg "-ftime-trace" og "-ftime-trace-granularity=N" for å generere en rapport om utførelsestiden for ulike stadier av frontend (parsing, initialisering) og backend (optimeringsstadier). Rapporten er lagret i json-format, kompatibel med chrome://tracing og speedscope.app;
  • Lagt til prosessering av "__declspec(allocator)"-spesifikatoren og generering av tilhørende feilsøkingsinformasjon som lar deg overvåke minneforbruk i Visual Studio-miljøet;
  • For C-språket er det lagt til støtte for «__FILE_NAME__»-makroen, som ligner «__FILE__»-makroen, men inkluderer bare filnavnet uten den fullstendige banen;
  • C++ har utvidet støtte for adresseromsattributter for å dekke ulike C++-funksjoner, inkludert parameter- og argumentmønstre, referansetyper, returtypeslutning, objekter, autogenererte funksjoner, innebygde operatorer og mer.
  • Mulighetene knyttet til støtte for OpenCL, OpenMP og CUDA er utvidet. Dette inkluderer innledende støtte for implisitt inkludering av innebygde OpenCL-funksjoner («-fdeclare-opencl-builtins»-flagget er lagt til), utvidelsen cl_arm_integer_dot_product er implementert, og diagnoseverktøy er utvidet;
  • Arbeidet til den statiske analysatoren er forbedret og dokumentasjon på utførelse av statisk analyse er lagt til. Lagt til flagg for å vise tilgjengelige kontrollmoduler og støttede alternativer ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" og "-analyzer-checker[-option]-help " -utvikler"). Lagt til "-analyzer-werror"-flagg for å behandle advarsler som feil.
    Lagt til nye bekreftelsesmoduser:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling for å identifisere usikker praksis for arbeid med buffere;
    • osx.MIGChecker for å søke etter brudd på MIG (Mach Interface Generator) kalleregler;
    • optin.osx.OSObjectCStyleCast for å finne feil XNU libkern-objektkonverteringer;
    • apiModeling.llvm med et sett med modelleringskontrollfunksjoner for å oppdage feil i LLVM-kodebasen;
    • Stabilisert kode for å sjekke uinitialiserte C++-objekter (UninitializedObject i optin.cplusplus-pakken);
  • Clang-format-verktøyet har lagt til støtte for formatering av kode i C#-språket og gir støtte for kodeformateringsstilen som brukes av Microsoft;
  • clang-cl, et alternativt kommandolinjegrensesnitt som gir kompatibilitet på alternativnivå med cl.exe-kompilatoren inkludert i Visual Studio, har lagt til heuristikk for å behandle ikke-eksisterende filer som kommandolinjealternativer og vise en tilsvarende advarsel (f.eks. når du kjører "clang-cl /diagnostic :caret /c test.cc");
  • En stor del av nye sjekker har blitt lagt til linter clang-rydy, inkludert ekstra sjekker spesifikke for OpenMP API;
  • Utvidet serverfunksjoner klangd (Clang Server), der bakgrunnsindeksbyggingsmodusen er aktivert som standard, er støtte for kontekstuelle handlinger med kode lagt til (variabel henting, utvidelse av auto- og makrodefinisjoner, konvertering av escapede strenger til unescaped), muligheten til å vise advarsler fra Clang-tidy, utvidet diagnostikk av feil i overskriftsfiler og lagt til muligheten til å vise informasjon om typehierarkiet;

Den viktigste innovasjoner LLVM 9.0:

  • En eksperimentell partisjoneringsfunksjon er lagt til LLD-linkeren, som lar deg dele ett program i flere deler, som hver ligger i en egen ELF-fil. Denne funksjonen lar deg starte hoveddelen av programmet, som vil laste inn andre komponenter etter behov under drift (for eksempel kan du separere den innebygde PDF-visningen til en egen fil, som bare lastes når brukeren åpner PDF-en fil).

    LLD Linker brakt i forgrunnen til en tilstand som er egnet for å koble Linux-kjernen for arkitekturene arm32_7, arm64, ppc64le og x86_64.
    Nye alternativer "-" (utgang til stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" og "-z common-page-size". For AArch64-arkitekturen er støtte for BTI (Branch Target Indicator) og PAC (Pointer Authentication Code) instruksjoner lagt til. Støtte for MIPS-, RISC-V- og PowerPC-plattformer har blitt betydelig forbedret. Lagt til innledende støtte for dynamisk kobling for WebAssembly;

  • I libc++ implementert funksjoner ssize, std::er_konstant_evaluert, std::midpoint og std::lerp, metodene "front" og "back" er lagt til std::span, attributter av typene std::is_unbounded_array og std::is_bounded_array er lagt til , std-funksjonene har blitt utvidet: :atomic. Støtte for GCC 4.9 er avviklet (kan brukes med GCC 5.1 og nyere utgivelser). Lagt til støtte VAR JEG (WebAssembly System Interface, et grensesnitt for bruk av WebAssembly utenfor nettleseren);
  • Nye optimaliseringer er lagt til. Aktivert konvertering av memcmp-kall til bcmp i noen situasjoner. Implementert utelatelse av rekkeviddekontroll for hopptabeller der nedre bryterblokker er utilgjengelige eller når instruksjoner ikke brukes, for eksempel ved oppkalling av funksjoner med typen void;
  • Backend for RISC-V-arkitekturen har blitt stabilisert, som ikke lenger er posisjonert som eksperimentell og er bygget som standard. Gir full kodegenereringsstøtte for RV32I og RV64I instruksjonssettvarianter med MAFDC-utvidelser;
  • Tallrike forbedringer har blitt gjort på backends for X86, AArch64, ARM, SystemZ, MIPS, AMDGPU og PowerPC-arkitekturer. For eksempel for arkitektur
    AArch64 la til støtte for SVE2 (Scalable Vector Extension 2) og MTE (Memory Tagging Extensions)-instruksjoner; i ARM-backend ble støtte for Armv8.1-M-arkitekturen og MVE (M-Profile Vector Extension)-utvidelsen lagt til. Støtte for GFX10 (Navi)-arkitekturen er lagt til AMDGPU-backend, funksjoner for funksjonsanrop er aktivert som standard, og et kombinert pass er aktivert DPP (Data-Parallelle Primitiver).

  • LLDB debugger har nå fargeutheving for tilbakesporing og lagt til støtte for DWARF4 debug_types og DWARF5 debug_info blokkene;
  • Støtte for objekt- og kjørbare filer i COFF-format er lagt til verktøyene llvm-objcopy og llvm-strip.

Kilde: opennet.ru

Legg til en kommentar