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

Kuuden kuukauden kehitystyön jälkeen esiteltiin LLVM 16.0 -projektin julkaisu - GCC-yhteensopiva työkalupakki (kääntäjät, optimoijat ja koodigeneraattorit), joka kokoaa ohjelmat RISC-tyyppisten virtuaalisten käskyjen välibittikoodiksi (matalatason virtuaalikone, jossa on monitasoinen optimointijärjestelmä). Luotu pseudokoodi voidaan muuntaa JIT-kääntäjällä konekäskyiksi suoraan ohjelman suoritushetkellä.

Tärkeimmät parannukset Clang 16.0:ssa:

  • C++/ObjC++-oletusstandardi on gnu++17 (aiemmin gnu++14), mikä tarkoittaa, että C++17:n ominaisuuksia GNU-laajennuksilla tuetaan oletuksena. Voit palauttaa edellisen toiminnan käyttämällä vaihtoehtoa "-std=gnu++14".
  • Toteutetut C++20-standardiin liittyvät lisäominaisuudet:
    • Ehdollisen triviaaleja erikoisjäsentoimintoja,
    • strukturoitujen sidosten kaappaaminen lambda-funktioissa,
    • Tasa-arvooperaattori lausekkeiden sisällä,
    • Mahdollisuus jättää typename-avainsana pois joissakin yhteyksissä,
    • Kelvollinen koontialustus suluissa ("Aggr(arvo1, arvo2)").
  • Tulevassa C++2b-standardissa määritellyt ominaisuudet on otettu käyttöön:
    • Yhdistelmälausekkeiden loppuun saa laittaa tunnisteita,
    • staattinen operaattori(),
    • staattinen operaattori[],
    • Yhteensopivuus char8_t-tyypin kanssa varmistetaan,
    • Tekstissä "\N{...}" käytettävien merkkien valikoimaa on laajennettu
    • Lisätty mahdollisuus käyttää muuttujia, jotka on ilmoitettu nimellä "staattinen constexpr" funktioissa, jotka on ilmoitettu constexpr.
  • Tulevassa C-standardissa C2x määritellyt ominaisuudet on otettu käyttöön:
    • "-Wunused-label" -varoituksen poistamiseksi käytöstä "[[maybe_unused]]"-attribuutti saa käyttää tarroissa
    • On sallittua sijoittaa tunnisteita mihin tahansa yhdistelmälausekkeisiin,
    • Lisätty typeof- ja typeof_unqual-operaattorit,
    • Uusi nullptr_t-tyyppi ja nullptr-vakio, jotka määrittävät nollaosoittimia, jotka voivat muuntaa mihin tahansa osoitintyyppiin ja edustavat NULL-muunnelmaa, joka ei ole sidottu kokonaisluku- ja void*-tyyppeihin.
    • C2x-tilassa va_start-makron kutsuminen vaihtelevalla määrällä argumentteja (variadic) on sallittua.
  • C99-, C11- ja C17-yhteensopivuustiloissa oletusasetukset "-Wimplicit-function-declaration" ja "-Wimplicit-int" tuottavat nyt virheen varoituksen sijaan.
  • Epäsuora "void *" (esim. "void func(void *p) { *p; }") käyttö C++-tilassa tuottaa nyt virheen, joka on samanlainen kuin ISO C++, GCC, ICC ja MSVC.
  • Bittikenttien määrittäminen käskyoperandeiksi (esim. "__asm ​​​​{ mov eax, s.bf }") Microsoft-tyylisissä rivin kokoonpanolohkoissa tuottaa nyt virheen.
  • Lisätty diagnostiikka erilaisten rakenteiden ja liitäntöjen esiintymiseksi samoilla nimillä eri moduuleissa.
  • OpenCL- ja OpenMP-tukeen liittyviä ominaisuuksia on laajennettu. Parannettu diagnostiikka OpenCL-ytimen argumenteissa käytettäville C++-malleille. Parannettu jonotuslohkotuki AMDGPU:lle. Nounwind-attribuutti lisätään implisiittisesti kaikkiin funktioihin. Parannettu tuki sisäänrakennetuille toiminnoille.
  • Lisätty mahdollisuus käyttää ympäristömuuttujaa CLANG_CRASH_DIAGNOSTICS_DIR määrittääkseen hakemiston, johon kaatumisdiagnostiikkatiedot tallennetaan.
  • Unicode-tuki on päivitetty Unicode 15.0 -spesifikaatioon. Jotkut matemaattiset symbolit ovat sallittuja tunnisteissa, kuten "₊" (esim. "double xₖ₊₁").
  • Lisätty tuki useiden asetustiedostojen lataamiseen (oletusasetustiedostot ladataan ensin ja sitten ne, jotka määritetään lipulla "--config=", jotka voidaan nyt määrittää useita kertoja). Muutettiin asetustiedostojen oletuslatausjärjestystä: clang yrittää ladata tiedoston ensin - .cfg, ja jos sitä ei löydy, se yrittää ladata kaksi tiedostoa .cfg ja .cfg. Jos haluat estää määritystiedostojen lataamisen oletusarvoisesti, "--no-default-config" -lippu on lisätty.
  • Toistettavien koontiversioiden varmistamiseksi on mahdollista korvata nykyiset päivämäärä- ja aikaarvot makroissa __DATE__, __TIME__ ja __TIMESTAMP__ SOURCE_DATE_EPOCH-ympäristömuuttujassa määritetyllä ajalla.
  • Jotta voidaan tarkistaa sisäänrakennettujen funktioiden (builtin), joita voidaan käyttää vakioiden yhteydessä, olemassaolo on lisätty makro "__has_constexpr_builtin".
  • Lisätty uusi käännösmerkki "-fcoro-aligned-allocation" tasattua korutiinikehysten varausta varten.
  • Lippu "-fstrict-flex-arrays=" toteuttaa tuen joustavien matriisielementtien kolmannelle varmennustasolle rakenteissa (Flexible Array Members, määrittelemättömän kokoinen taulukko rakenteen lopussa). Kolmannella tasolla vain kokoa "[]" (esimerkiksi "int b[]") käsitellään joustavana taulukkona, mutta kokoa "[0]" (esimerkiksi "int b[0]") ei ole.
  • Lisätty "-fmodule-output" -lippu, joka mahdollistaa yksivaiheisen käännösmallin tavallisille C++-moduuleille.
  • Lisätty "-Rpass-analysis=stack-frame-layout" -tila, joka auttaa diagnosoimaan pinokehyksen asettelun ongelmia.
  • Lisättiin uusi attribuutti __attribute__((target_version("cpu_features"))) ja laajennettiin attribuutin __attribute__((target_clones("cpu_features1","cpu_features2",...))) toiminnallisuutta AArch64:n tarjoamien ominaisuuksien tiettyjen versioiden valitsemiseksi prosessorit.
  • Diagnostiikkatyökaluja laajennettu:
    • Lisätty varoitus "-Wsingle-bit-bitfield-constant-conversion", joka havaitsee implisiittisen katkaisun, kun se määritetään yksibittiselle allekirjoitetulle bittikentälle.
    • Alustamattomien constexpr-muuttujien diagnostiikkaa on laajennettu.
    • Lisätty "-Wcast-function-type-strict" ja "-Winyhteensopiva-funktio-osoittimen-tyypit-tiukka" varoitukset tunnistamaan mahdolliset ongelmat funktiotyypin valussa.
    • Lisätty diagnostiikka virheellisten tai varattujen moduulinimien käyttämiseen vientilohkoissa.
    • Parannettu puuttuvien "automaattisten" avainsanojen havaitseminen määritelmissä.
    • "-Winteger-overflow" -varoituksen käyttöönotto on lisännyt ylivuotojin johtavien lisätilanteiden tarkistuksia.
  • Toteutettu tuki LoongArch-käskysarjan arkkitehtuurille (-march=loongarch64 tai -march=la464), jota käytetään Loongson 3 5000 -prosessoreissa ja joka ottaa käyttöön uuden RISC ISA:n, joka on samanlainen kuin MIPS ja RISC-V.

Tärkeimmät innovaatiot LLVM 16.0:ssa:

  • LLVM-koodi saa käyttää C++17-standardissa määriteltyjä elementtejä.
  • LLVM-rakennuksen ympäristövaatimuksia on korotettu. Rakennustyökalujen pitäisi nyt tukea C++17-standardia, ts. Rakentaaksesi tarvitset vähintään GCC 7.1:n, Clang 5.0:n, Apple Clang 10.0:n tai Visual Studio 2019 16.7:n.
  • AArch64-arkkitehtuurin taustaohjelma lisää tuen Cortex-A715-, Cortex-X3- ja Neoverse V2 -suorittimille, RME MEC:n (Memory Encryption Contexts) -kokoonpanon, Armv8.3-laajennusten (Complex Number) ja Function Multi Versioningin.
  • ARM-arkkitehtuurin taustajärjestelmässä tuki Armv2-, Armv2A-, Armv3- ja Armv3M-kohdealustoille on lopetettu, joille oikean koodin luomista ei taattu. Lisätty mahdollisuus luoda koodi ohjeille kompleksilukujen kanssa työskentelyä varten.
  • X86-arkkitehtuurin taustaohjelmassa on lisätty tuki käskysarjaarkkitehtuureille (ISA:ille) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Lisätty tuki RDMSRLIST-, RMSRLIST- ja WRMSRNS-ohjeille. Toteutetut vaihtoehdot "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" ja "-mcpu=grandridge".
  • Lisätty virallinen tuki LoongArch-alustalle.
  • Parannetut taustaohjelmat MIPS-, PowerPC- ja RISC-V-arkkitehtuureille
  • Lisätty tuki 64-bittisten suoritettavien tiedostojen virheenkorjaukseen LoongArch-arkkitehtuuria varten LLDB-virheenkorjaajaan. COFF-debug-symbolien parannettu käsittely. Edellyttää päällekkäisten DLL-tiedostojen suodatusta ladattujen Windows-moduulien luettelossa.
  • Libc++-kirjastossa päätyö keskittyi C++20- ja C++23-standardien uusien ominaisuuksien tuen toteuttamiseen.
  • LDD-linkkeri lyhentää merkittävästi linkitysaikaa rinnakkaisemalla osoitteensiirtoskannauksen ja osien alustustoiminnot. Lisätty tuki osien pakkaamiseen ZSTD-algoritmin avulla.

Lähde: opennet.ru

Lisää kommentti