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

Kuuden kuukauden kehitystyön jälkeen esitetty projektin julkaisu LLVM 11.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ä.

Tärkein muutos uudessa julkaisussa oli sisällyttäminen Laippa, Fortran-kielen käyttöliittymä. Flang tukee Fortran 2018:aa, OpenMP 4.5:tä ja OpenACC 3.0:aa, mutta projektin kehitystä ei ole vielä saatu päätökseen ja käyttöliittymä rajoittuu koodin jäsentämiseen ja oikeellisuuden tarkistamiseen. LLVM-välikoodin luomista ei vielä tueta, ja suoritettavien tiedostojen luomiseksi kanoninen koodi luodaan ja välitetään ulkoiselle Fortran-kääntäjälle.

Parannuksia Clang 11.0:ssa:

  • Lisätty mahdollisuus palauttaa abstrakti syntaksipuu (AST) rikkinäiselle C++-koodille, jota voidaan käyttää virheiden diagnosoimiseen ja joka tarjoaa lisätietoa ulkoisille apuohjelmille, kuten clang-tidy ja clangd. Ominaisuus on oletusarvoisesti käytössä C++-koodille, ja sitä ohjataan "-Xclang -f[no-]recovery-ast" -asetuksilla.
  • Lisätty uusia diagnostiikkatiloja:
    • "-Wpointer-to-int-cast" on ryhmä varoituksia, jotka koskevat osoittimien lähettämistä kokonaislukutyyppiin int, joka ei mahdu kaikkia mahdollisia arvoja.
    • "-Wuninitialized-const-reference" - varoitus alustamattomien muuttujien välittämisestä funktioparametreissa, jotka hyväksyvät viiteargumentit "const"-attribuutilla.
    • "-Wimplicit-const-int-float-conversion" - käytössä oletusarvoisesti varoitus todellisen vakion implisiittisestä muuntamisesta kokonaislukutyypiksi.
  • ARM-alustalle tarjotaan kääntäjään sisäänrakennetut C-toiminnot (Ominaisuudet), korvattu tehokkailla vektorikäskyillä Arm v8.1-M MVE ja CDE. Käytettävissä olevat toiminnot on määritelty otsikkotiedostoissa arm_mve.h ja arm_cde.h.
  • lisättyä joukko laajennettuja kokonaislukutyyppejä _ExtInt(N), jonka avulla voit luoda tyyppejä, jotka eivät ole kahden potenssien kerrannaisia, ja jotka voidaan käsitellä tehokkaasti FPGA/HLS:ssä. Esimerkiksi, _ExtInt(7) määrittää kokonaislukutyypin, joka koostuu 7 bitistä.
  • Lisätty makroja, jotka määrittävät tuen sisäänrakennetuille C-funktioille ARM SVE:n (Scalable Vector Extension) ohjeiden perusteella:
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Esimerkiksi __ARM_FEATURE_SVE-makro määritetään luotaessa AArch64-koodia asettamalla komentorivivaihtoehto "-march=armv8-a+sve".

  • Lippu "-O" tunnistetaan nyt optimointitilalla "-O1" "-O2":n sijaan.
  • Lisätty uudet kääntäjän liput:
    • "-fstack-clash-protection" - mahdollistaa suojauksen pinon ja kasan leikkauspisteet.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - voit valita poikkeuskäsittelijän tilan liukulukuille.
    • "-ffp-model={precise,strict,fast}" - Yksinkertaistaa liukulukujen erikoisvaihtoehtojen käyttöä.
    • "-fpch-codegen" ja "-fpch-debuginfo" luodaan esikäännetty otsikko (PCH), jossa on erilliset objektitiedostot koodia ja debuginfoa varten.
    • "-fsanitize-coverage-allowlist" ja "-fsanitize-coverage-blocklist" kattavuuden tarkistamiseen valkoisten ja mustien listojen testaamiseen.
    • "-mtls-size={12,24,32,48}" valitaksesi TLS (thread-local storage) -koon.
    • "-menable-experimental-extension" ottaa käyttöön kokeelliset RISC-V-laajennukset.
  • C:n oletustila on "-fno-common", mikä mahdollistaa tehokkaamman pääsyn globaaleihin muuttujiin joillakin alustoilla.
  • Moduulin oletusvälimuisti on siirretty /tmp:stä ~/.cache-hakemistoon. Voit ohittaa käyttämällä lippua "-fmodules-cache-path=".
  • C-kielen oletusstandardi on päivitetty gnu11:stä gnu17:ään.
  • Lisätty alustava tuki GNU C -laajennukselle "asm inline» lisätäksesi kokoonpanolisäosia. Laajennusta analysoidaan edelleen, mutta sitä ei käsitellä millään tavalla.
  • OpenCL- ja CUDA-tukeen liittyviä ominaisuuksia on laajennettu. Lisätty tuki OpenCL 2.0 -lohkodiagnostiikalle ja otettu käyttöön uusia OpenMP 5.0 -ominaisuuksia.
  • Lisätty IndentExternBlock-vaihtoehto clang-muotoiseen apuohjelmaan ulkoisten "C"- ja ulkoisten "C++"-lohkojen kohdistamista varten.
  • Staattinen analysaattori on parantanut C++:n perittyjen konstruktorien käsittelyä. Lisätty uudet tarkistukset alpha.core.C11Lock ja alpha.fuchsia.Lock lukkojen tarkistamiseen, alpha.security.cert.pos.34c putenv:n vaarallisen käytön havaitsemiseen, webkit.NoUncountedMemberChecker ja webkit.RefCntblBaseVirtualDtor lukemattomien tyyppien ongelmien havaitsemiseen, alpha .cplusplus .SmartPtr tarkistaa, onko älykkään osoittimen viittausta tyhjäksi.
  • Linterissä siististi lisätty suuri osa uusia shekkejä.
  • Clangd-välimuistipalvelin (Clang Server) on parantanut suorituskykyä ja lisännyt uusia diagnostiikkaominaisuuksia.

Pääasiallinen innovaatioita LLVM 11.0:

  • Rakennusjärjestelmä on vaihdettu käyttämään Python 3:a. Jos Python 3 ei ole saatavilla, on mahdollista palata käyttämään Python 2:ta.
  • Käyttöliittymä, jossa on Go-kielen kääntäjä (llgo), on jätetty julkaisun ulkopuolelle, ja se voidaan järjestää uudelleen tulevaisuudessa.
  • Vektorifunktio-abi-varianttiattribuutti on lisätty väliesitykseen (IR) kuvaamaan skalaari- ja vektorifunktioiden välistä kuvausta kutsujen vektoroimiseksi. Llvm::VectorTypesta on kaksi erillistä vektorityyppiä llvm::FixedVectorType ja llvm::ScalableVectorType.
  • Udef-arvoihin perustuva haarautuminen ja undef-arvojen välittäminen standardikirjastofunktioille tunnistetaan määrittelemättömäksi käytökseksi. SISÄÄN
    memset/memcpy/memmove sallii undef-osoittimien välittämisen, mutta jos parametrin koko on nolla.

  • LLJIT on lisännyt tuen staattisten alustusten suorittamiseen LLJIT::initialize- ja LLJIT::deinitialize-menetelmillä. Mahdollisuus lisätä staattisia kirjastoja JITDylibiin StaticLibraryDefinitionGenerator-luokan avulla on otettu käyttöön. Lisätty C API kohteelle ORCv2 (API JIT-kääntäjien rakentamiseen).
  • Tuki Cortex-A64-, Cortex-A34-, Cortex-A77- ja Cortex-X78-prosessoreille on lisätty AArch1-arkkitehtuurin taustajärjestelmään. Toteutetut ARMv8.2-BF16 (BFloat16) ja ARMv8.6-A laajennukset, mukaan lukien RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Graned Traps), ARMv8.6-AMU (Activity Monitors -virtualisointi) ja ARMv8.0-DGH (tiedonkeruuvinkki). Tarjolla on mahdollisuus luoda koodia sisäänrakennetuille funktioille, jotka liittyvät SVE-vektorikäskyihin.
  • Tuki Cortex-M55-, Cortex-A77-, Cortex-A78- ja Cortex-X1-prosessoreille on lisätty ARM-arkkitehtuurin taustajärjestelmään. Laajennukset toteutettu
    Armv8.6-A Matrix Multiply ja RMv8.2-AA32BF16 BFloat16.

  • PowerPC-arkkitehtuurin taustajärjestelmään on lisätty tuki koodin luomiselle POWER10-prosessoreille. Silmukan optimointia on laajennettu ja liukulukujen tukea on parannettu.
  • RISC-V-arkkitehtuurin taustajärjestelmä mahdollistaa korjaustiedostojen hyväksymisen, jotka tukevat kokeellisia laajennettuja käskysarjoja, joita ei ole vielä virallisesti hyväksytty.
  • AVR-arkkitehtuurin taustaohjelma on siirretty kokeellisesta luokasta stabiiliin, joka sisältyy perusjakeluun.
  • x86-arkkitehtuurin taustaohjelma tukee Intelin AMX- ja TSXLDTRK-ohjeita. Lisätty suoja hyökkäyksiä vastaan LVI (Load Value Injection) ja toteuttaa myös yleisen Spekulatiivisen suorituksen sivuvaikutusten estomekanismin estääkseen hyökkäykset, jotka johtuvat suorittimen toimintojen spekulatiivisesta suorittamisesta.
  • SystemZ-arkkitehtuurin taustajärjestelmään on lisätty tuki MemorySanitizerille ja LeakSanitizerille.
  • Lisätty tuki matemaattisia vakioita sisältävälle otsikkotiedostolle Libc++:aan .
  • Laajennettu LLD-linkkeriominaisuudet. Parannettu tuki ELF-muodolle, mukaan lukien lisätyt vaihtoehdot "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Lisätty "--time-trace" -vaihtoehto tallentaaksesi jäljen tiedostoon, joka voidaan sitten analysoida Chromen chrome://tracing-käyttöliittymän kautta.

Lähde: opennet.ru

Lisää kommentti