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

Kuuden kuukauden kehitystyön jälkeen esitetty projektin julkaisu LLVM 10.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 10.0:n uusia ominaisuuksia ovat C++-konseptien tuki, Clangia ei enää suoriteta erillisenä prosessina, tuki CFG-tarkastuksille (control flow guard) Windowsille ja tuki uusille suoritinominaisuuksille.

Parannuksia Clang 10.0:ssa:

  • Lisätty tuki kohteelle "käsitteitä", C++-mallin laajennus, joka sisällytetään seuraavaan standardiin, koodinimeltään C++2a (ottaa käyttöön lipulla -std=c++2a).
    Käsitteiden avulla voit määrittää joukon malliparametrivaatimuksia, jotka käännöshetkellä rajoittavat argumenttien määrää, jotka voidaan hyväksyä malliparametreiksi. Käsitteitä voidaan käyttää välttämään loogisia epäjohdonmukaisuuksia mallissa käytettyjen tietotyyppien ominaisuuksien ja syöteparametrien tietotyyppiominaisuuksien välillä.

    sapluuna
    käsite EqualityComparable = vaatii(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Oletusarvoisesti erillisen prosessin ("clang -cc1") käynnistäminen, jossa käännös suoritetaan, pysäytetään. Kääntäminen on nyt tehty pääprosessissa, ja "-fno-integrated-cc1"-vaihtoehtoa voidaan käyttää palauttamaan vanha toiminta.
  • Uudet diagnostiikkatilat:
    • "-Wc99-designator" ja "-Wreorder-init-list" varoittavat C99-alustajien käyttämisestä C++-tilassa tapauksissa, joissa ne ovat oikein C99:ssä mutta eivät C++20:ssa.
    • "-Wsizeof-array-div" - sieppaa tilanteet, kuten "int arr[10]; …sizeof(arr) / sizeof(short)…” (pitäisi olla "sizeof(arr) / sizeof(int)").
    • "-Wxor-used-as-po" - varoittaa käyttämästä konstruktioita, kuten "^" (xor) -operaattoria operaatioissa, jotka voidaan sekoittaa eksponentiointiin (2^16).
    • "-Wfinal-dtor-non-final-class" - varoittaa luokista, joita ei ole merkitty "final"-määritteellä, mutta joissa on "final"-attribuutilla varustettu tuhoaja.
    • "-Wtautological-bitwise-compare" on ryhmä varoituksia tautologisten vertailujen diagnosoimiseksi bittikohtaisen operaation ja vakion välillä sekä aina tosi vertailujen tunnistamiseksi, joissa bittikohtaista TAI-operaatiota sovelletaan ei-negatiiviseen numeroon.
    • "-Wbitwise-conditional-parenheses" varoittaa ongelmista, kun sekoitetaan loogisia operaattoreita AND (&) ja OR (|) ehdollisen operaattorin (?:) kanssa.
    • "-Wmisleading-indentation" on GCC:n samannimisen tarkistuksen analogi, joka varoittaa sisennetyistä lausekkeista ikään kuin ne olisivat osa if/else/for/while-lohkoa, mutta itse asiassa ne eivät sisälly tähän lohkoon. .
    • Kun määritetään "-Wextra", "-Wdeprecated-copy" -valinta on käytössä, varoittaa rakentajien käytöstä
      "siirrä" ja "kopioi" luokissa, joissa on eksplisiittinen destruktorin määritelmä.

    • Tarkistuksia "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" on laajennettu.
    • Tarkistukset "-Wbitwise-op-parenthes" ja "-Wlogical-op-parenthes" ovat oletuksena pois käytöstä.
  • C- ja C++-koodissa osoittimen aritmeettiset operaatiot ovat sallittuja vain taulukoissa. Undefined Behavior Sanitizer "-fsanitize=pointer-overflow" -tilassa havaitsee nyt tapaukset, kuten nollasta poikkeavan siirtymän lisäämisen nollaosoittimeen tai nollaosoittimen luomisen, kun kokonaisluku vähennetään ei-nolla-osoittimesta.
  • "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) -tila on sovitettu tunnistamaan lisäys- ja vähennystoimintojen ongelmat tyypeille, joiden bittikoko on pienempi kuin "int"-tyypin bittikoko.
  • Kun valitaan x86-kohdearkkitehtuurit "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" ja "-march=cooperlake" oletusarvoisesti vektorisoidussa koodi on lopettanut 512-bittisten zmm-rekisterien käytön, lukuun ottamatta niiden suoraa osoitusta lähdekoodissa. Syynä on, että suorittimen taajuus laskee suoritettaessa 512-bittisiä toimintoja, mikä voi vaikuttaa negatiivisesti yleiseen suorituskykyyn. Uuden toiminnan muuttamiseksi on tarjolla vaihtoehto "-mprefer-vector-width=512".
  • Lippu "-flax-vector-conversions" toimii samalla tavalla kuin GCC: implisiittiset vektoribittien muunnokset kokonaisluku- ja liukulukuvektorien välillä ovat kiellettyjä. Tämän rajoituksen poistamiseksi ehdotetaan lipun käyttöä
    "-flax-vector-conversions=all", joka on oletusarvo.

  • Parannettu tuki Octeon-perheen MIPS-suorittimille. Lisätty "octeon+" kelvollisten CPU-tyyppien luetteloon.
  • WebAssembly-välikoodiin koottaessa kutsutaan automaattisesti wasm-opt-optimoija, jos se on saatavilla järjestelmässä.
  • RISC-V-arkkitehtuuriin perustuvissa järjestelmissä liukulukuarvoja tallentavien rekisterien käyttö on sallittua kokoajan riviliitosten ehdollisissa lohkoissa.
  • Lisätty uudet kääntäjän liput: "-fgnuc-version" asettaaksesi versioarvon "__GNUC__" ja vastaaville makroille; "-fmacro-prefix-map=OLD=NEW" korvaamaan hakemiston etuliite OLD uudella makroissa, kuten "__FILE__"; "-fpatchable-function-entry=N[,M]" luo tietyn määrän NOP-käskyjä ennen funktion aloituspistettä ja sen jälkeen. RISC-V:lle
    lisätty tuki "-ffixed-xX", "-mcmodel=medany" ja "-mcmodel=medlow"-lipuille.

  • Lisätty tuki attribuutille ‘__attribute__((target(“branch-protection=..."))), jonka vaikutus on samanlainen kuin valinnalla - oksien suojaus.
  • Windows-alustalla "-cfguard"-lippua määritettäessä toteutetaan suorituksen kulun eheystarkistukset (Control Flow Guard) korvaamalla epäsuorat toimintokutsut. Voit poistaa shekin korvaamisen käytöstä käyttämällä "-cfguard-nochecks" -lippua tai "__declspec(guard(nocf)" -muuttajaa.
  • Attribuutin gnu_inline käyttäytyminen on samanlainen kuin GCC tapauksissa, joissa sitä käytetään ilman "extern"-avainsanaa.
  • OpenCL- ja CUDA-tukeen liittyviä ominaisuuksia on laajennettu. Lisätty tuki uusille OpenMP 5.0 -ominaisuuksille.
  • Clang-format -apuohjelmaan on lisätty Standard-vaihtoehto, jonka avulla voit määrittää koodin jäsentämisessä ja muotoilussa käytetyn C++-standardin version (uusin, automaattinen, c++03, c++11, c++14, c++17, c++20 ).
  • Staattiseen analysaattoriin on lisätty uusia tarkistuksia: alpha.cplusplus.PlacementNew sen määrittämiseksi, onko tallennustilaa riittävästi, fuchsia.HandleChecker havaitsemaan Fuchsia-käsittelijöihin liittyvät vuodot, security.insecureAPI.decodeValueOfObjCType havaitsemaan mahdolliset puskurin ylivuodot käytettäessä [NSCoder decodevCTalueyV. :at:] .
  • Undefined Behavior Sanitizer (UBSan) on laajentanut osoittimen ylivuototarkistuksiaan havaitakseen nollasta poikkeavien siirtymien soveltamisen NULL-osoittimiin tai siitä johtuvan NULL-osoittimen siirtymän lisäämisen.
  • Linterissä siististi lisätty suuri osa uusia shekkejä.

Pääasiallinen innovaatioita LLVM 10.0:

  • Kehyksiin Attributor Uusia prosessienvälisiä optimointeja ja analysaattoreita on lisätty. Ennustetaan 19 eri attribuutin tila, mukaan lukien 12 attribuuttia 12 LLVM IR ja 7 abstraktia attribuuttia, kuten eloisuus.
  • Kääntäjään on lisätty uusia matemaattisia matriisifunktioita (Ominaisuudet), jotka korvataan tehokkailla vektorikäskyillä kääntämisen aikana.
  • X86-, AArch64-, ARM-, SystemZ-, MIPS-, AMDGPU- ja PowerPC-arkkitehtuurien taustajärjestelmiin on tehty lukuisia parannuksia. Lisätty CPU-tuki
    Cortex-A65, Cortex-A65AE, Neoverse E1 ja Neoverse N1. ARMv8.1-M:lle koodin luontiprosessi on optimoitu (esimerkiksi on ilmestynyt tuki silmukoille, joilla on minimaalinen ylikuormitus) ja autovektorisoinnin tuki on lisätty MVE-laajennuksella. Parannettu CPU MIPS Octeon -tuki. PowerPC:ssä on otettu käyttöön matemaattisten aliohjelmien vektorointi MASSV-kirjaston (Mathematical Acceleration SubSystem) avulla, koodin luonti on parannettu ja muistin käyttö silmukoista on optimoitu. X86:ssa vektorityyppien v2i32, v4i16, v2i16, v8i8, v4i8 ja v2i8 käsittelyä on muutettu.

  • Parannettu koodigeneraattori WebAssemblylle. Lisätty tuki TLS:lle (Thread-Local Storage) ja atomic.fence-ohjeille. SIMD-tukea on laajennettu merkittävästi. WebAssembly-objektitiedostot voivat nyt käyttää moniarvoisia funktioiden allekirjoituksia.
  • Analysaattoria käytetään silmukoiden käsittelyyn MuistiSSA, jonka avulla voit määrittää riippuvuuksia eri muistitoimintojen välillä. MemorySSA voi lyhentää käännös- ja suoritusaikaa tai sitä voidaan käyttää AliasSetTrackerin sijasta suorituskyvyn menettämättä.
  • LLDB-debuggeri on parantanut huomattavasti tukea DWARF v5 -muodolle. Parannettu tuki rakentamiseen MinGW:n kanssa
    ja lisätty alustava kyky korjata Windows-suoritustiedostoja ARM- ja ARM64-arkkitehtuureille. Lisätty kuvaukset vaihtoehdoista, joita tarjotaan automaattisen täydennyksen yhteydessä painamalla sarkainta.

  • Laajennettu LLD-linkkeriominaisuudet. Parannettu tuki ELF-muodolle, mukaan lukien glob-mallien täydellisen yhteensopivuuden varmistaminen GNU-linkkerin kanssa, tuen lisääminen pakatuille virheenkorjausosioille ".zdebug", PT_GNU_PROPERTY-ominaisuuden lisääminen .note.gnu.property-osion määrittämiseen (voidaan käyttää tulevaisuudessa Linux-ytimet),
    Tilat "-z noseparate-code", "-z erillinen koodi" ja "-z erilliset ladattavat segmentit" on otettu käyttöön. Parannettu tuki MinGW:lle ja WebAssemblylle.

Lähde: opennet.ru

Lisää kommentti