Kuuden kuukauden kehitystyön jälkeen on julkaistu LLVM 22.1.0. Se kehittää työkaluja (kääntäjiä, optimoijia ja koodigeneraattoreita), jotka kääntävät ohjelmat RISC-tyyppisten virtuaaliohjeiden (matalan tason virtuaalikone, jossa on monitasoinen optimointijärjestelmä) välibittikoodiksi. Luotu pseudokoodi voidaan muuntaa konekoodiksi tietylle kohdealustalle tai sitä voidaan käyttää just-in-time (JIT) -kääntäjässä koneohjeiden luomiseen suoraan ohjelman suorituksen aikana. LLVM-teknologioihin perustuen projekti kehittää Clang-kääntäjää, joka tukee C-, C++- ja Objective-C-ohjelmointikieliä. 18.x-haarasta alkaen projekti siirtyi uuteen versionumerointijärjestelmään, jonka mukaan kehitysvaiheessa käytetään versiota 0 ("N.0") ja ensimmäinen vakaa versio on numeroitu "N.1".
Clang 22:n parannuksia ovat mm.
- Lisätty tuki muistin allokointitokeneille (Allocation Tokens), joilla voidaan merkitä funktioilla, kuten malloc, suoritetut muistin allokointitoiminnot yksilöllisellä tunnisteella. Allokointitokenit mahdollistavat kekotietojen jäsentämisen, muistivuotojen havaitsemisen yksinkertaistamisen ja objektien ryhmittelyn niiden käyttötarkoituksen tai muokkausmallien perusteella (esim. "kuuman" datan erottaminen "kylmästä" datasta). Ota tämä käyttöön käyttämällä lippua "-fsanitize=alloc-token".
- C-kieleen liittyvät ominaisuudet:
- Luonnosspesifikaatio, joka määrittelee "defer"-suoritusmekanismin, on toteutettu. Tämä mahdollistaa toimintojen suorittamisen, kun nykyinen laajuusalue poistuu käytöstä. Lippu "-fdefer-ts" on lisätty "defer"-tuen mahdollistamiseksi.
- Sisäänrakennettu funktio __builtin_stack_address() on lisätty, ja se peilaa GCC:n vastaavaa funktiota. Tämä funktio palauttaa pino-osoitteen, joka erottaa __builtin_stack_address()-funktiota kutsuneen nykyisen funktion ja sen kutsumien seuraavien funktioiden pino-alueen.
- Tulevaa C2y-standardia varten kehitettävät ominaisuudet:
- Lisätty tuki nimetyille silmukoille, jonka avulla voit antaa nimiä silmukoille ja switch-lausekkeille. Nämä voidaan määrittää break- ja continue-lausekkeissa, jotta voidaan eksplisiittisesti määrittää silmukka, josta poistutaan. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // siirry CONT1:een continue outer; // siirry CONT2:een // CONT1 } // CONT2 }
- Sisäänrakennetun "__COUNTER__"-makron, joka on suunniteltu luomaan yksilöllisiä tunnistenimiä, toteutusta on laajennettu ja sisällytetty standardiin. Tämän makron kutsujen enimmäismääräksi on asetettu 2147483647; tämän rajan ylittäminen aiheuttaa virheen.
- Poistettu varoitus (-Wstatic-in-inline), joka ilmenee käytettäessä staattisia funktioita tai muuttujia "extern inline" -funktioiden sisällä.
- C23 C -standardissa määritellyt ominaisuudet:
- float.h-otsikkotiedosto tukee nyt FLT_SNAN-, DBL_SNAN- ja LDBL_SNAN-makroja, jotka toteuttavat signaloituja (aritmeettisissa operaatioissa poikkeuksen aiheuttavia) NaN-arvoja float-, double- ja long double -tyypeille.
- Korjattu virhe, jossa eri nimeämättömiä tyyppejä käsiteltiin yhteensopivina saman käännösyksikön sisällä, jos niillä oli samat kentät.
- Riippuvuustarkistuksen aikana puuttuvien otsikkotiedostojen ohittamiseen käytettyä "-MG"-lippua on laajennettu koskemaan "#embed"-direktiivejä, ja se estää nyt "tiedostoa ei löydy" -virheen, kun "#embed"-direktiivissä määritetty tiedosto puuttuu.
- C++:aan liittyvät ominaisuudet:
- C++2c (C++26) -spesifikaatiossa kehitetyn kaltainen mahdollisuus käyttää strukturoituja sidoksia "constexpr"-kontekstissa on lisätty. Tämä tarkoittaa, että viittaukset vakiolausekkeisiin voivat nyt itse olla vakiolausekkeita. Tuki taulukoille ja yksinkertaisille rakenteille on toteutettu (tupleja ei vielä tueta). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- C++20-standardin vaatimusten mukaisesti rajoitteet muunnetaan nyt standardimuotoon ennen niiden tarkistamista, mikä mahdollistaa tarkemmat diagnostiikkaviestit ja korvausvirheiden asianmukaisen käsittelyn vain käsite-id-elementeissä käytettävissä mallineargumenteissa.
- Lisätty sisäänrakennettujen funktioiden perhe "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" selvittämään, syntetisoitiinko vertailuoperaattorit "<", ">", "<=" ja ">=" "<=>"-operaattorista.
- Parametria "-Wincompatible-pointer-types" on muutettu näyttämään virheen varoituksen sijaan. Voit palata aiempaan toimintaan käyttämällä asetusta "-Wno-error=incompatible-pointer-types".
- Lisätty sisäänrakennetut funktiot __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter ja __builtin_dedup_pack. Esimerkiksi builtin_dedup_pack mahdollistaa kaksoiskappaleiden poistamisen tyyppiluettelosta käyttämällä funktiota MyTypeList = TypeList<__builtin_dedup_pack. …>; // tuloksena oleva tyyppi on TypeList
- Kun määrittämätöntä toimintaa debuggataan UBSanilla (-fsanitize=undefined -fsanitize-trap=undefined), virheen syyn tiedot sisällytetään nyt luotuihin debug-tietoihin. Lippu "-fsanitize-debug-trap-reasons" on lisätty määrittämään virhetietojen yksityiskohtaisuustaso. Se voidaan asettaa arvoon "basic" yleisiä kuvauksia varten (esim. "Kokonaislukujen yhteenlasku ylittyi") ja arvoon "detailed" yksityiskohtaisia tietoja varten (esim. "etumerkityn kokonaislukujen yhteenlaskun ylitys 'a + b'").
- Lisätty uudet kääntäjän liput:
- "-f[no-]sanitize-debug-trap-reasons" määrittää, sisällytetäänkö poikkeusten syyt debug-tietoihin käännettäessä "-fsanitize-trap"-tilassa.
- Muistin allokointitunnusten hallintaan käytetään seuraavia komentoja: "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" ja "-fsanitize-alloc-token-extended".
- "-fmatrix-memory-layout" matriisityyppien muistiasettelun hallintaan (esim. column-major sarake-päämatriisille, row-major rivi-päämatriiseille).
- Funktioilla on nyt "malloc_span"-attribuutti, joka on samanlainen kuin malloc-attribuutti, mutta soveltuu funktioille, jotka palauttavat span-tyyppisiä rakenteita, jotka sisältävät osoittimen ja kentän, jolla on koko, tai osoittimen lohkon loppuun.
- Lisätty "modular_format"-attribuutti, jolla voidaan dynaamisesti valita printf-funktion vaadittu staattisesti linkitetty toteutus linkityshetkellä.
- Diagnostisia ja staattisia analyysityökaluja on laajennettu ja uusia tarkistuksia on lisätty (useita kymmeniä diagnostiikkaan liittyviä parannuksia).
- X86-taustajärjestelmään on lisätty SSE-, AVX- ja AVX512-laajennusten lisäominaisuuksia. Wildcat Lake (-march=wildcatlake) ja Nova Lake (-march=novalake) -mikroarkkitehtuureihin perustuville Intel-suorittimille on lisätty koontitilat.
- AArch64-taustajärjestelmä tukee nyt Ampere Computingin Ampere1C (ampere1c)-, Arm C1-Nano (c1-nano)-, Arm C1-Pro (c1-pro)-, Arm C1-Premium (c1-premium)- ja Arm C1-Ultra (c1-ultra) -prosessoreita. FCVTZ[US]-, FCVTN[US]-, FCVTM[US]-, FCVTP[US]- ja FCVTA[US]-käskyille on lisätty lisää sisäänrakennettuja funktioita. Funktioiden moniversioinnin (FMV) tukea on vakiinnutettu. Käyttäjät voivat nyt ohittaa eri funktioversioiden prioriteetin.
- Lisätty tuki LoongArch32 (LA32R, LA32S) -arkkitehtuurille.
- Parannetut taustajärjestelmät ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- ja PowerPC-arkkitehtuureille.
Lähde: opennet.ru
