Vrijgave van de LLVM 9.0-compilersuite

Na zes maanden ontwikkeling ingediend project vrijgeven LLVM 9.0 — GCC-compatibele tools (compilers, optimizers en codegeneratoren), die programma's compileren in tussenbitcodes van RISC-achtige virtuele instructies (virtuele machine op laag niveau met een optimalisatiesysteem op meerdere niveaus). De gegenereerde pseudocode kan met behulp van een JIT-compiler direct tijdens de programma-uitvoering in machine-instructies worden omgezet.

Nieuwe functies van LLVM 9.0 zijn onder meer de verwijdering van de experimentele ontwerptag van het doel-RISC-V-platform, C++-ondersteuning voor OpenCL, de mogelijkheid om een ​​programma op te splitsen in dynamisch geladen delen in LLD, en de implementatie van de “asm ga naar", gebruikt in de Linux-kernelcode. libc++ heeft ondersteuning toegevoegd voor WASI (WebAssembly System Interface), en LLD heeft initiële ondersteuning toegevoegd voor dynamische koppelingen met WebAssembly.

Verbeteringen in Clang 9.0:

  • Toegevoegd implementatie van de GCC-specifieke uitdrukking "asm ga naar“, waarmee u van een inline-assemblerblok naar een label in C-code kunt gaan. Deze functie is vereist om de Linux-kernel te bouwen in de “CONFIG_JUMP_LABEL=y”-modus met behulp van Clang op systemen met x86_64-architectuur. Rekening houdend met de wijzigingen die in eerdere releases zijn toegevoegd, kan de Linux-kernel nu in Clang worden gebouwd voor de x86_64-architectuur (voorheen werd alleen bouwen voor de arm-, aarch64-, ppc32-, ppc64le- en mips-architecturen ondersteund). Bovendien zijn Android- en ChromeOS-projecten al geconverteerd om Clang te gebruiken voor het bouwen van kernels, en Google test Clang als het belangrijkste platform voor het bouwen van kernels voor zijn productie-Linux-systemen. In de toekomst kunnen andere LLVM-componenten worden gebruikt in het kernelbouwproces, waaronder LLD, llvm-objcopy, llvm-ar, llvm-nm en llvm-objdump;
  • Experimentele ondersteuning toegevoegd voor het gebruik van C++17 in OpenCL. Specifieke kenmerken zijn onder meer ondersteuning voor adresruimte-attributen, het blokkeren van adresruimte-conversie door type casting-operators, het aanbieden van vectortypen zoals in OpenCL voor C, de aanwezigheid van specifieke OpenCL-typen voor afbeeldingen, gebeurtenissen, kanalen, enz.
  • Nieuwe compilervlaggen “-ftime-trace” en “-ftime-trace-granularity=N” toegevoegd om een ​​rapport te genereren over de uitvoeringstijd van verschillende fasen van de frontend (parsing, initialisatie) en backend (optimalisatiefasen). Het rapport wordt opgeslagen in json-formaat, compatibel met chrome://tracing en speedscope.app;
  • Toegevoegde verwerking van de “__declspec(allocator)”-specificatie en het genereren van bijbehorende foutopsporingsinformatie waarmee u het geheugenverbruik in de Visual Studio-omgeving kunt controleren;
  • Voor de C-taal is ondersteuning toegevoegd voor de macro “__FILE_NAME__”, die lijkt op de macro “__FILE__”, maar alleen de bestandsnaam bevat zonder het volledige pad;
  • C++ heeft de ondersteuning voor adresruimteattributen uitgebreid om verschillende C++-functies te dekken, waaronder parameter- en argumentpatronen, referentietypen, gevolgtrekkingen van retourtypen, objecten, automatisch gegenereerde functies, ingebouwde operators en meer.
  • De mogelijkheden geassocieerd met ondersteuning voor OpenCL, OpenMP en CUDA zijn uitgebreid. Dit omvat initiële ondersteuning voor impliciete opname van ingebouwde OpenCL-functies (de vlag "-fdeclare-opencl-builtins" is toegevoegd), de extensie cl_arm_integer_dot_product is geïmplementeerd en diagnostische hulpmiddelen zijn uitgebreid;
  • Het werk van de statische analyser is verbeterd en documentatie over het uitvoeren van statische analyses is toegevoegd. Vlaggen toegevoegd om beschikbare checkermodules en ondersteunde opties weer te geven (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” en “-analyzer-checker[-option]-help ” -ontwikkelaar"). Vlag "-analyzer-werror" toegevoegd om waarschuwingen als fouten te behandelen.
    Nieuwe verificatiemodi toegevoegd:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling om onveilige praktijken voor het werken met buffers te identificeren;
    • osx.MIGChecker om te zoeken naar overtredingen van MIG-oproepregels (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast om onjuiste XNU libkern-objectconversies te vinden;
    • apiModeling.llvm met een reeks modelcontrolefuncties om fouten in de LLVM-codebase te detecteren;
    • Gestabiliseerde code voor het controleren van niet-geïnitialiseerde C++-objecten (UninitializedObject in het optin.cplusplus-pakket);
  • Het clang-format-hulpprogramma heeft ondersteuning toegevoegd voor het opmaken van code in de C#-taal en biedt ondersteuning voor de code-opmaakstijl die door Microsoft wordt gebruikt;
  • clang-cl, een alternatieve opdrachtregelinterface die compatibiliteit op optieniveau biedt met de cl.exe-compiler in Visual Studio, heeft heuristieken toegevoegd om niet-bestaande bestanden te behandelen als opdrachtregelopties en een bijbehorende waarschuwing weer te geven (bijvoorbeeld bij het uitvoeren van "clang-cl /diagnostic:caret /c test.cc");
  • Er is een groot deel van de nieuwe controles toegevoegd aan linter-clang-tidy, inclusief extra controles die specifiek zijn voor de OpenMP API;
  • Uitgebreid servermogelijkheden klonk (Clang Server), waarin de modus voor het bouwen van de achtergrondindex standaard is ingeschakeld, is ondersteuning voor contextuele acties met code toegevoegd (ophalen van variabelen, uitbreiding van automatische en macrodefinities, conversie van ontsnapte strings naar niet-geëscapede strings), de mogelijkheid om weer te geven waarschuwingen van Clang-tidy, uitgebreide diagnostiek van fouten in headerbestanden en de mogelijkheid toegevoegd om informatie over de typehiërarchie weer te geven;

De belangrijkste innovaties LLVM 9.0:

  • Er is een experimentele partitiefunctie toegevoegd aan de LLD-linker, waarmee u een programma in verschillende delen kunt splitsen, die elk in een afzonderlijk ELF-bestand staan. Met deze functie kunt u het hoofdgedeelte van het programma starten, waardoor andere componenten worden geladen als dat nodig is tijdens de werking (u kunt bijvoorbeeld de ingebouwde PDF-viewer opsplitsen in een afzonderlijk bestand, dat alleen wordt geladen wanneer de gebruiker de PDF opent bestand).

    LLD Linker gebracht naar een staat die geschikt is voor het koppelen van de Linux-kernel voor arm32_7-, arm64-, ppc64le- en x86_64-architecturen.
    Nieuwe opties "-" (uitvoer naar stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" en "-z common-page-size". Voor de AArch64-architectuur is ondersteuning voor BTI (Branch Target Indicator) en PAC (Pointer Authentication Code) instructies toegevoegd. Ondersteuning voor MIPS-, RISC-V- en PowerPC-platforms is aanzienlijk verbeterd. Initiële ondersteuning toegevoegd voor dynamische koppelingen voor WebAssembly;

  • In libc++ geïmplementeerd functies ssize, std::is_constant_evaluated, std::midpoint en std::lerp, methoden “front” en “back” zijn toegevoegd aan std::span, attributen van de typen std::is_unbounded_array en std::is_bounded_array zijn toegevoegd , std-mogelijkheden zijn uitgebreid: :atomic. Ondersteuning voor GCC 4.9 is stopgezet (kan worden gebruikt met GCC 5.1 en nieuwere releases). Ondersteuning toegevoegd WAS IK (WebAssembly System Interface, een interface voor het gebruik van WebAssembly buiten de browser);
  • Er zijn nieuwe optimalisaties toegevoegd. Conversie van memcmp-aanroepen naar bcmp is in sommige situaties ingeschakeld. Geïmplementeerd weglaten van bereikcontrole voor springtabellen waarin lagere schakelblokken onbereikbaar zijn of wanneer instructies niet worden gebruikt, bijvoorbeeld bij het aanroepen van functies met het type void;
  • De backend voor de RISC-V-architectuur is gestabiliseerd, deze is niet langer experimenteel gepositioneerd en wordt standaard gebouwd. Biedt volledige ondersteuning voor het genereren van codes voor RV32I- en RV64I-instructiesetvarianten met MAFDC-extensies;
  • Er zijn talloze verbeteringen aangebracht aan de backends voor X86-, AArch64-, ARM-, SystemZ-, MIPS-, AMDGPU- en PowerPC-architecturen. Voor architectuur bijvoorbeeld
    AArch64 heeft ondersteuning toegevoegd voor SVE2 (Scalable Vector Extension 2) en MTE (Memory Tagging Extensions) instructies; in de ARM-backend is ondersteuning voor de Armv8.1-M-architectuur en de MVE (M-Profile Vector Extension) -extensie toegevoegd. Ondersteuning voor de GFX10 (Navi)-architectuur is toegevoegd aan de AMDGPU-backend, de mogelijkheden voor functieaanroepen zijn standaard ingeschakeld en een gecombineerde pas is geactiveerd DPP (Data-parallelle primitieven).

  • De LLDB-debugger heeft nu kleuraccentuering voor backtraces en toegevoegde ondersteuning voor de DWARF4 debug_types en DWARF5 debug_info blokken;
  • Ondersteuning voor object- en uitvoerbare bestanden in COFF-indeling is toegevoegd aan de hulpprogramma's llvm-objcopy en llvm-strip.

Bron: opennet.ru

Voeg een reactie