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

Kuuden kuukauden kehitystyön jälkeen esiteltiin LLVM 12.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ä.

Clang 12.0:n parannukset:

  • Tuki C++20-standardissa ehdotetuille "todennäköisille" ja "epätodennäköisille" attribuuteille on otettu käyttöön ja otettu käyttöön oletusarvoisesti, jolloin optimoija voi saada tietoa ehdollisen rakenteen käynnistymisen todennäköisyydestä (esimerkiksi "[[todennäköinen" ]] if (satunnainen > 0) {“).
  • Lisätty tuki AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) ja Intel Sapphire Rapids (-march=sapphirerapids) prosessoreille.
  • Lisätty tuki "-march=x86-64-v[234]"-lipuille x86-64-arkkitehtuuritasojen valitsemiseksi (v2 - kattaa SSE4.2-, SSSE3-, POPCNT- ja CMPXCHG16B-laajennukset; v3 - AVX2 ja MOVBE; v4 - AVX-512 ) .
  • Lisätty tuki Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) ja Fujitsu A64FX (a64fx) prosessoreille. Voit esimerkiksi ottaa optimoinnin käyttöön Neoverse-V1-suorittimille määrittämällä "-mcpu=neoverse-v1".
  • AArch64-arkkitehtuuriin on lisätty uudet kääntäjän liput "-moutline-atomics" ja "-mno-outline-atomics" ottamaan käyttöön tai poistamaan käytöstä atomitoiminnan aputoimintoja, kuten "__aarch64_cas8_relax". Tällaiset toiminnot havaitsevat ajon aikana, onko LSE (Large System Extensions) -tuki saatavilla, ja käyttävät mukana toimitettuja atomiprosessorin ohjeita tai palaavat käyttämään synkronoinnissa LL/SC (Load-link/store-conditional) -ohjeita.
  • Lisätty "-fbinutils-version" -vaihtoehto binutils-ohjelmistopaketin kohdeversion valitsemiseksi, jotta se on yhteensopiva vanhempien linkki- ja kokoonpanotoimintojen kanssa.
  • ELF-suoritettaville tiedostoille, kun "-gz"-lippu on määritetty, virheenkorjaustietojen pakkaus zlib-kirjaston avulla on oletusarvoisesti käytössä (gz=zlib). Tuloksena olevien objektitiedostojen linkittäminen vaatii lld tai GNU binutils 2.26+. Voit palauttaa yhteensopivuuden vanhojen binutils-versioiden kanssa määrittämällä "-gz=zlib-gnu".
  • "Tämä"-osoitin käsitellään nyt ei-null- ja dereferenceable(N)-tarkistuksilla. Voit poistaa nonnull-attribuutin, kun sinun on käytettävä NULL-arvoja, käyttämällä "-fdelete-null-pointer-checks" -vaihtoehtoa.
  • Linux-alustalla "-fasynchronous-unwind-tables" -tila on otettu käyttöön AArch64- ja PowerPC-arkkitehtuureissa purkamispuhelutaulukoiden luomiseksi, kuten GCC:ssä.
  • Kohdassa "#pragma clang loop vectorize_width" lisättiin mahdollisuus määrittää "kiinteä" (oletus) ja "skaalattava" asetukset vektorointimenetelmän valitsemiseksi. Vektorin pituudesta riippumaton "skaalautuva" tila on kokeellinen ja sitä voidaan käyttää laitteistossa, joka tukee skaalautuvaa vektorointia.
  • Parannettu tuki Windows-alustalle: Viralliset binaarikokoonpanot Windowsille Arm64-järjestelmissä on valmistettu, mukaan lukien Clang-kääntäjä, LLD-linkkeri ja kääntäjä-rt-ajonaikaiset kirjastot. Rakennettaessa MinGW-kohdealustoille .exe-liite lisätään, jopa ristiin käännettäessä.
  • OpenCL-, OpenMP- ja CUDA-tukeen liittyviä ominaisuuksia on laajennettu. Lisätty vaihtoehdot "-cl-std=CL3.0" ja "-cl-std=CL1.0" makrovaihtoehtojen valitsemiseksi OpenCL 3.0:lle ja OpenCL 1.0:lle. Diagnostiikkatyökaluja on laajennettu.
  • Lisätty tuki HRESET-, UINTR- ja AVXVNNI-ohjeille, jotka on toteutettu joissakin x86-pohjaisissa prosessoreissa.
  • x86-järjestelmissä "-mtune="-vaihtoehdon tuki on käytössä ", joka aktivoi valitut mikroarkkitehtoniset optimoinnit riippumatta "-march= "
  • Staattinen analysaattori on parantanut joidenkin POSIX-toimintojen käsittelyä ja merkittävästi parantanut ehdollisten operaatioiden tuloksen määritystä, kun vertailussa on useita symbolisia arvoja. Uusia tarkistuksia on lisätty: fuchia.HandleChecker (määrittää kahvat rakenteissa), webkit.UncountedLambdaCapturesChecker webkit ja alpha.webkit.UncountedLocalVarsChecker (ottaa huomioon WebKit-moottorikoodin osoittimien kanssa työskentelyn erityispiirteet).
  • Vakioiden yhteydessä käytetyissä lausekkeissa käytetään sisäänrakennettuja funktioita __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __verse, bbs_, __verse, bbs_ wap, __bswapd, __bswap64, on sallittu. __bswapq , _castf*, __rol* ja __ror*.
  • Lisätty BitFieldColonSpacing-vaihtoehto clang-format-apuohjelmaan, jonka avulla voit valita tunnisteiden, sarakkeiden ja kenttämääritelmien ympärillä olevan välin.
  • Linux-alustan clangd-välimuistipalvelin (Clang Server) on vähentänyt merkittävästi muistin kulutusta pitkäaikaisen käytön aikana (säännölliset kutsut malloc_trim-osoitteeseen tarjotaan vapaan muistisivun palauttamiseksi käyttöjärjestelmään).

Tärkeimmät innovaatiot LLVM 12.0:ssa:

  • Pythonilla kirjoitetun llvm-build-koontityökalun tuki on lopetettu, ja sen sijaan projekti on siirtynyt kokonaan CMake-koontijärjestelmän käyttöön.
  • AArch64-arkkitehtuurin taustaohjelmassa Windows-alustan tukea on parannettu: on varmistettu oikea assembler-tulosteen generointi kohde-Windows-järjestelmille, datan luonti unwind-kutsuista on optimoitu (tällaisten tietojen kokoa on pienennetty 60:llä %), mahdollisuus luoda purkamisdataa assemblerilla on lisätty käskyt .seh_*.
  • PowerPC-arkkitehtuurin taustajärjestelmä sisältää uusia optimointeja silmukoille ja inline-käyttöönotolle, laajennettu tuki Power10-prosessoreille, lisätty tuki MMA-ohjeille matriisinkäsittelyyn ja parannettu tuki AIX-käyttöjärjestelmälle.
  • x86-taustajärjestelmä lisää tuen AMD Zen 3-, Intel Alder Lake- ja Intel Sapphire Rapids -prosessoreille sekä HRESET-, UINTR- ja AVXVNNI-suorittimien ohjeet. Tuki MPX:lle (Memory Protection Extensions) osoittimien tarkistamiseksi sen varmistamiseksi, että muistirajoja ei enää tueta (tämä tekniikka ei ole laajalle levinnyt, ja se on jo poistettu GCC:stä ja kilisemisestä). Kokoonpanijaan on lisätty tuki etuliitteille {disp32} ja {disp8} sekä .d32- ja .d8-liitteille operandin siirtymien ja hyppyjen koon ohjaamiseksi. Lisätty uusi attribuutti "tune-cpu" ohjaamaan mikroarkkitehtonisten optimointien sisällyttämistä.
  • Uusi tila "-fsanitize=unsigned-shift-base" on lisätty kokonaislukuongelman ilmaisimeen (integer sanitizer, "-fsanitize=integer") havaitsemaan etumerkittömien kokonaislukujen ylivuodot bitin siirtymisen jälkeen vasemmalle.
  • Eri ilmaisimiin (asan, cfi, lsan, msan, tsan, ubsan sanitizer) on lisätty tuki Linux-jakeluille tavallisella Musl-kirjastolla.
  • LLD-linkerin ominaisuuksia on laajennettu. Parannettu tuki ELF-muodolle, mukaan lukien lisätyt vaihtoehdot "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program" -näkyvyys"" Parannettu MinGW-tuki. Mach-O-muodossa (macOS) on otettu käyttöön tuki arm64-, arm- ja i386-arkkitehtuureille, linkkiaikaoptimoinnit (LTO) ja pinon purkaminen poikkeusten käsittelyä varten.
  • Libc++ ottaa käyttöön C++20-standardin uudet ominaisuudet ja on aloittanut C++2b-määrittelyn ominaisuuksien kehittämisen. Lisätty tuki rakentamiseen poistamalla lokalisointituki ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") ja laitteet pseudosatunnaislukujen luomiseen ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF").

Lähde: opennet.ru

Lisää kommentti