LLVM 9.0 -kääntäjäpaketin julkaisu

Kuuden kuukauden kehitystyön jälkeen esitetty projektin julkaisu LLVM 9.0 — GCC-yhteensopivat työkalut (kääntäjät, optimoijat ja koodigeneraattorit), ohjelmien kääntäminen RISC-tyyppisten virtuaalisten käskyjen välibittikoodiksi (matalatason virtuaalikone monitasoisella optimointijärjestelmällä). Luotu pseudokoodi voidaan muuntaa JIT-kääntäjällä konekäskyiksi suoraan ohjelman suoritushetkellä.

LLVM 9.0:n uusia ominaisuuksia ovat kokeellisen suunnittelutunnisteen poistaminen kohde-RISC-V-alustalta, C++-tuki OpenCL:lle, mahdollisuus jakaa ohjelma dynaamisesti ladattuihin osiin LLD:ssä ja "asm goto", jota käytetään Linux-ytimen koodissa. libc++ lisäsi tuen WASI:lle (WebAssembly System Interface) ja LLD lisäsi alustavan tuen WebAssemblyn dynaamiselle linkittämiselle.

Parannuksia Clang 9.0:ssa:

  • lisätty GCC-spesifisen lausekkeen toteutus "asm goto“, jonka avulla voit siirtyä rivin kokoisesta lohkosta C-koodin tarraan. Tämä ominaisuus tarvitaan Linux-ytimen rakentamiseen "CONFIG_JUMP_LABEL=y"-tilassa käyttämällä Clangia järjestelmissä, joissa on x86_64-arkkitehtuuri. Ottaen huomioon aikaisemmissa julkaisuissa tehdyt muutokset, Linux-ydin voidaan nyt rakentaa Clangissa x86_64-arkkitehtuurille (aiemmin vain arm-, aarch64-, ppc32-, ppc64le- ja mips-arkkitehtuurien rakentaminen oli tuettu). Lisäksi Android- ja ChromeOS-projektit on jo muunnettu käyttämään Clangia ytimen rakentamiseen, ja Google testaa Clangia pääalustana ytimien rakentamiseen tuotantojärjestelmilleen. Tulevaisuudessa ytimen rakennusprosessissa voidaan käyttää muita LLVM-komponentteja, mukaan lukien LLD, llvm-objcopy, llvm-ar, llvm-nm ja llvm-objdump;
  • Lisätty kokeellinen tuki C++17:n käyttöön OpenCL:ssä. Erityisiä ominaisuuksia ovat tuki osoiteavaruuden määritteille, osoiteavaruuden muuntamisen estäminen tyypin casting-operaattoreiden avulla, vektorityyppien tarjoaminen kuten OpenCL for C:ssä, tiettyjen OpenCL-tyyppien läsnäolo kuville, tapahtumille, kanaville jne.
  • Lisätty uudet kääntäjän liput "-ftime-trace" ja "-ftime-trace-granularity=N" luomaan raportin käyttöliittymän (jäsennys, alustus) ja taustaohjelman (optimointivaiheet) eri vaiheiden suoritusajoista. Raportti on tallennettu json-muodossa, joka on yhteensopiva chrome://tracing- ja speedscope.app-tiedostojen kanssa;
  • Lisätty "__declspec(allocator)" -määritteen käsittely ja siihen liittyvien virheenkorjaustietojen luominen, jonka avulla voit seurata muistin kulutusta Visual Studio -ympäristössä;
  • C-kielelle on lisätty tuki makrolle "__FILE_NAME__", joka muistuttaa makroa "__FILE__", mutta sisältää vain tiedostonimen ilman koko polkua.
  • C++ on laajentanut osoiteavaruuden attribuuttien tukea kattamaan erilaisia ​​C++-ominaisuuksia, mukaan lukien parametri- ja argumenttimallit, viitetyypit, palautustyypin päättelyt, objektit, automaattisesti luodut funktiot, sisäänrakennetut operaattorit ja paljon muuta.
  • OpenCL-, OpenMP- ja CUDA-tukeen liittyviä ominaisuuksia on laajennettu. Tämä sisältää alustavan tuen sisäänrakennettujen OpenCL-toimintojen implisiittiselle sisällyttämiselle ("-fdeclare-opencl-builtins" -lippu on lisätty), cl_arm_integer_dot_product-laajennus on otettu käyttöön ja diagnostiikkatyökaluja on laajennettu;
  • Staattisen analysaattorin työtä on parannettu ja dokumentaatiota staattisen analyysin suorittamisesta on lisätty. Lisätty liput näyttämään käytettävissä olevat tarkistusmoduulit ja tuetut asetukset ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" ja "-analyzer-checker[-option]-help" " -kehittäjä"). Lisätty "-analyzer-werror" -lippu, jotta varoitukset käsitellään virheinä.
    Lisätty uusia vahvistustiloja:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling tunnistaa puskurien kanssa työskentelyn vaaralliset käytännöt;
    • osx.MIGChecker etsii MIG (Mach Interface Generator) -puhelusääntöjen rikkomuksia;
    • optin.osx.OSObjectCStyleCast löytääksesi virheelliset XNU libkern -objektimuunnokset;
    • apiModeling.llvm, jossa on joukko mallinnuksen tarkistustoimintoja LLVM-koodikannan virheiden havaitsemiseksi;
    • Stabiloitu koodi alustamattomien C++-objektien tarkistamiseen (UninitializedObject optin.cplusplus-paketissa);
  • Clang-format -apuohjelma on lisännyt tuen koodin muotoilulle C#-kielellä ja tukee Microsoftin käyttämää koodin muotoilutyyliä.
  • clang-cl, vaihtoehtoinen komentorivikäyttöliittymä, joka tarjoaa vaihtoehtotason yhteensopivuuden Visual Studioon sisältyvän cl.exe-kääntäjän kanssa, on lisännyt heuristiikkaa, joka käsittelee olemattomia tiedostoja komentorivivaihtoehtoina ja näyttää vastaavan varoituksen (esim. kun suoritetaan "clang-cl /diagnostic :caret /c test.cc");
  • Suuri osa uusista tarkistuksista on lisätty linterin närästykseen, mukaan lukien lisätyt OpenMP API -kohtaiset tarkistukset;
  • Laajennettu palvelimen ominaisuudet kolahti (Clang Server), jossa taustahakemiston rakennustila on oletusarvoisesti käytössä, lisätty tuki kontekstuaalisille toiminnoille koodilla (muuttujien haku, automaattisten ja makromääritelmien laajentaminen, koodinvaihtomerkkien muuntaminen ei-merkkijonoiksi), näyttömahdollisuus varoitukset Clang-tidyltä, laajennettu virheiden diagnostiikka otsikkotiedostoissa ja lisätty mahdollisuus näyttää tietoja tyyppihierarkiasta;

Pääasiallinen innovaatioita LLVM 9.0:

  • LLD-linkkeriin on lisätty kokeellinen osiointiominaisuus, jonka avulla voit jakaa yhden ohjelman useisiin osiin, joista jokainen sijaitsee erillisessä ELF-tiedostossa. Tämän ominaisuuden avulla voit käynnistää ohjelman pääosan, joka lataa muut komponentit tarpeen mukaan käytön aikana (voit esimerkiksi erottaa sisäänrakennetun PDF-katseluohjelman erilliseksi tiedostoksi, joka latautuu vasta, kun käyttäjä avaa PDF-tiedoston tiedosto).

    LLD Linkker toi tilaan, joka sopii Linux-ytimen linkittämiseen arm32_7-, arm64-, ppc64le- ja x86_64-arkkitehtuureille.
    Uudet vaihtoehdot "-" (tulostus stdoutiin), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" ja "-z common-page-size". AArch64-arkkitehtuuriin on lisätty tuki BTI (Branch Target Indicator) ja PAC (Pointer Authentication Code) -ohjeille. Tukea MIPS-, RISC-V- ja PowerPC-alustoille on parannettu merkittävästi. Lisätty alustava tuki WebAssemblyn dynaamiseen linkitykseen;

  • Libc++:ssa toteutettu funktiot ssize, std::is_constant_evaluated, std::midpoint ja std::lerp, menetelmät "front" ja "back" on lisätty std::span:iin, attribuutit tyyppejä std::is_unbounded_array ja std::is_bounded_array on lisätty , std-ominaisuuksia on laajennettu: :atomic. GCC 4.9:n tuki on lopetettu (voidaan käyttää GCC 5.1:n ja uudempien julkaisujen kanssa). Lisätty tuki OLINKO MINÄ (WebAssembly System Interface, käyttöliittymä WebAssemblyn käyttämiseen selaimen ulkopuolella);
  • Uusia optimointeja on lisätty. Käytössä memcmp-kutsujen muuntaminen bcmp:ksi joissakin tilanteissa. Toteutettu välitarkistuksen jättäminen pois hyppytaulukoissa, joissa alemmat kytkinlohkot eivät ole tavoitettavissa tai kun käskyjä ei käytetä, esimerkiksi kutsuttaessa toimintoja, joiden tyyppi on void;
  • RISC-V-arkkitehtuurin taustaosa on vakiintunut, jota ei enää sijoiteta kokeelliseksi ja se on rakennettu oletuksena. Tarjoaa täyden koodinluontituen RV32I- ja RV64I-käskysarjan muunnelmille MAFDC-laajennuksilla;
  • X86-, AArch64-, ARM-, SystemZ-, MIPS-, AMDGPU- ja PowerPC-arkkitehtuurien taustajärjestelmiin on tehty lukuisia parannuksia. Esimerkiksi arkkitehtuuriin
    AArch64 lisäsi tuen SVE2- (Scalable Vector Extension 2) ja MTE (Memory Tagging Extensions) -ohjeille; ARM-taustajärjestelmään lisättiin tuki Armv8.1-M-arkkitehtuurille ja MVE-laajennukselle (M-Profile Vector Extension). Tuki GFX10 (Navi) -arkkitehtuurille on lisätty AMDGPU-taustajärjestelmään, toimintokutsuominaisuudet ovat oletuksena käytössä ja yhdistetty passi on aktivoitu DPP (Data-Parallel Primitives).

  • LLDB-debuggerissa on nyt värikorostus paluujäljityksille ja lisätty tuki DWARF4-debug_types- ja DWARF5-debug_info-lohkoille;
  • Llvm-objcopy- ja llvm-strip-apuohjelmiin on lisätty tuki COFF-muotoisille objekti- ja suoritettaville tiedostoille.

Lähde: opennet.ru

Lisää kommentti