LLVM 10.0 kompilaatorikomplekti väljalase

Pärast kuuekuulist arengut esitatakse projekti vabastamine LLVM 10.0 — GCC-ga ühilduvad tööriistad (kompilaatorid, optimeerijad ja koodigeneraatorid), programmide kompileerimine RISC-laadsete virtuaalsete käskude vahepealsesse bitikoodi (madala tasemega virtuaalmasin mitmetasandilise optimeerimissüsteemiga). Loodud pseudokoodi saab JIT-kompilaatori abil teisendada masinakäskudeks vahetult programmi täitmise ajal.

LLVM 10.0 uued funktsioonid hõlmavad C++ kontseptsioonide tuge, Clangi ei käitata enam eraldi protsessina, Windowsi CFG (control flow valve) kontrollide tugi ja uute protsessori võimaluste tugi.

Parandused Clang 10.0-s:

  • Lisatud tugi: "mõisted", C++ malli laiendus, mis lisatakse järgmisse standardisse, koodnimega C++2a (sisse lülitatud lipuga -std=c++2a).
    Kontseptsioonid võimaldavad teil määratleda malli parameetrite nõuete komplekti, mis kompileerimise ajal piiravad argumentide kogumit, mida saab malli parameetritena aktsepteerida. Mõisteid saab kasutada malli sees kasutatavate andmetüüpide omaduste ja sisendparameetrite andmetüübi omaduste vahel loogiliste vastuolude vältimiseks.

    malli
    mõiste VõrdlusVõrdlus = nõuab(T a, T b) {
    { a == b } -> std::tõve;
    { a != b } -> std::tõve;
    };

  • Vaikimisi peatatakse eraldi protsessi („clang -cc1”) käivitamine, milles kompileerimine toimub. Nüüd tehakse põhiprotsessis kompileerimine ja vana käitumise taastamiseks saab kasutada suvandit "-fno-integrated-cc1".
  • Uued diagnostikarežiimid:
    • "-Wc99-designator" ja "-Wreorder-init-list" hoiatavad C99 lähtestajate kasutamise eest C++ režiimis juhtudel, kui need on õiged C99-s, kuid mitte C++20-s.
    • "-Wsizeof-array-div" – püüab kinni sellised olukorrad nagu "int arr[10]; …sizeof(arr) / sizeof(short)…” (peaks olema „sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" – hoiatab selliste konstruktsioonide kasutamise eest nagu näiteks operaatori "^" (xor) kasutamine operatsioonides, mida võib segi ajada astendamisega (2^16).
    • "-Wfinal-dtor-non-final-class" - hoiatab klasside eest, mis ei ole märgitud "final" spetsifikaatoriga, kuid millel on destructor atribuudiga "final".
    • "-Wtautological-bitwise-compare" on hoiatuste rühm bitipõhise toimingu ja konstandi tautoloogiliste võrdluste diagnoosimiseks ning alati tõeste võrdluste tuvastamiseks, mille puhul biti kaupa VÕI-toimingut rakendatakse mittenegatiivsele arvule.
    • "-Wbitwise-conditional-parentheses" hoiatab probleemide eest, kui segatakse loogilisi operaatoreid AND (&) ja OR (|) tingimusliku operaatoriga (?:).
    • “-Wmisleading-indentation” on analoog GCC-st pärit samanimelisele kontrollile, mis hoiatab taandega avaldiste eest, nagu oleksid need osa if/else/for/while plokist, kuid tegelikult neid selles plokis ei sisaldu. .
    • “-Wextra” määramisel on lubatud kontroll “-Wdeprecated-copy”, mis hoiatab konstruktorite kasutamise eest
      "teisaldada" ja "kopeerida" selgesõnalise hävitaja määratlusega klassides.

    • Laiendatud on kontrolle "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis".
    • Märkused "-Wbitwise-op-parenthes" ja "-Wlogical-op-parenthes" on vaikimisi keelatud.
  • C- ja C++-koodis on kursori aritmeetilised toimingud lubatud ainult massiivides. Undefined Behavior Sanitizer režiimis "-fsanitize=pointer-overflow" püüab nüüd kinni sellised juhtumid nagu nullist erineva nihke lisamine nullkursorile või nullkursori loomine täisarvu lahutamisel mitte-null-osutist.
  • Režiim "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) on kohandatud tuvastama suurendamis- ja kahandamistoimingutega seotud probleeme tüüpidel, mille biti suurus on väiksem kui "int" tüübil.
  • X86 sihtarhitektuuride valimisel vektoriseeritud kood on lõpetanud 512-bitiste zmm-registrite kasutamise, välja arvatud nende otsene viide lähtekoodis. Põhjus on selles, et protsessori sagedus väheneb 512-bitiste toimingute tegemisel, mis võib üldist jõudlust negatiivselt mõjutada. Uue käitumise muutmiseks on ette nähtud valik "-mprefer-vector-width=512".
  • Lipu "-lina-vektor-teisendused" käitumine on sarnane GCC-ga: kaudsed vektorbittide teisendused täisarvu ja ujukomavektorite vahel on keelatud. Selle piirangu kõrvaldamiseks tehakse ettepanek kasutada lippu
    "-lina-vektor-konversioonid=kõik", mis on vaikeseade.

  • Täiustatud tugi Octeoni perekonna MIPS-protsessoritele. Kehtivate protsessoritüüpide loendisse on lisatud "octeon+".
  • WebAssembly vahekoodiks kokkupanemisel kutsutakse automaatselt välja Wasm-opt optimeerija, kui see on süsteemis saadaval.
  • RISC-V arhitektuuril põhinevate süsteemide puhul on ujukomaväärtusi salvestavate registrite kasutamine lubatud komplekteerija siseste lisade tingimusplokkides.
  • Lisatud uued kompilaatori lipud: "-fgnuc-version", et määrata "__GNUC__" ja sarnaste makrode versiooni väärtus; "-fmacro-prefix-map=OLD=NEW" kataloogi eesliide OLD asendamiseks NEW makrodes nagu "__FILE__"; "-fpatchable-function-entry=N[,M]", et genereerida teatud arv NOP-käske enne ja pärast funktsiooni sisenemispunkti. RISC-V jaoks
    lisatud tugi lippudele "-ffixed-xX", "-mcmodel=medany" ja "-mcmodel=medlow".

  • Lisatud tugi atribuudile ‘__attribute__((target(“branch-protection=..."))), mille toime on sarnane valikuga -haru kaitse.
  • Windowsi platvormil rakendatakse lipu "-cfguard" määramisel täitmisvoo terviklikkuse kontrollide (Control Flow Guard) asendamine kaudsete funktsioonikutsete jaoks. Tšeki asendamise keelamiseks võite kasutada lippu "-cfguard-nochecks" või modifikaatorit "__declspec(guard(nocf))".
  • Atribuudi gnu_inline käitumine on sarnane GCC-ga juhtudel, kui seda kasutatakse ilma märksõna "extern"ta.
  • Laiendatud on OpenCL-i ja CUDA toega seotud võimalusi. Lisatud on uute OpenMP 5.0 funktsioonide tugi.
  • Clang-format utiliidile on lisatud standardne suvand, mis võimaldab määrata koodi sõelumisel ja vormindamisel kasutatava C++ standardi versiooni (Viimane, Auto, c++03, c++11, c++14, c++17, c++20 ).
  • Staatilisele analüsaatorile on lisatud uued kontrollid: alpha.cplusplus.PlacementNew, et teha kindlaks, kas salvestusruumi on piisavalt, fuksia.HandleChecker Fuchsia käitlejatega seotud lekete tuvastamiseks, security.insecureAPI.decodeValueOfObjCType puhvri võimalike ületäitumiste tuvastamiseks [NSCalueOfCoder decodeyCTalueyV. :at:] .
  • Undefined Behavior Sanitizer (UBSan) on laiendanud oma kursori ületäitumise kontrolle, et tuvastada nullist erineva nihke rakendamine NULL-osutitele või sellest tulenev NULL-osuti nihke lisamine.
  • Linteris kõlisev-korras lisatud suur osa uusi tšekke.

Kõik uuendused LLVM 10.0:

  • Raamistiku juurde Attributor Lisatud on uued protseduuridevahelised optimeerimised ja analüsaatorid. Ennustatakse 19 erineva atribuudi olekut, sealhulgas 12 atribuuti 12 LLVM IR ja 7 abstraktset atribuuti, nagu elavus.
  • Lisatud on kompilaatorisse sisseehitatud uued maatriksmatemaatilised funktsioonid (Olemuslikud omadused), mis asendatakse kompileerimise ajal tõhusate vektorkäskudega.
  • X86, AArch64, ARM-i, SystemZ-i, MIPS-i, AMDGPU ja PowerPC-arhitektuuride taustaprogramme on tehtud arvukalt täiustusi. Lisatud CPU tugi
    Cortex-A65, Cortex-A65AE, Neoverse E1 ja Neoverse N1. ARMv8.1-M jaoks on koodi genereerimise protsess optimeeritud (näiteks on ilmunud minimaalse üldkuluga silmuste tugi) ja MVE laienduse abil on lisatud automaatse vektoriseerimise tugi. Täiustatud CPU MIPS Octeoni tugi. PowerPC jaoks on lubatud matemaatiliste alamprogrammide vektoriseerimine MASSV (Mathematical Acceleration SubSystem) teeki kasutades, koodi genereerimine on täiustatud ja mälu juurdepääs silmustest on optimeeritud. X86 puhul on muudetud vektoritüüpide v2i32, v4i16, v2i16, v8i8, v4i8 ja v2i8 käsitlemist.

  • WebAssembly täiustatud koodigeneraator. Lisatud on TLS-i (Thread-Local Storage) ja atomic.fence juhiste tugi. SIMD tugi on oluliselt laienenud. WebAssembly objektifailidel on nüüd võimalus kasutada mitme väärtusega funktsioonide allkirju.
  • Analüsaatorit kasutatakse silmuste töötlemisel MäluSSA, mis võimaldab määratleda sõltuvusi erinevate mäluoperatsioonide vahel. MemorySSA võib lühendada kompileerimis- ja täitmisaega või seda saab kasutada AliasSetTrackeri asemel ilma jõudlust kaotamata.
  • LLDB silur on oluliselt parandanud DWARF v5 vormingu tuge. Täiustatud tugi MinGW-ga ehitamiseks
    ja lisati algne võimalus siluda Windowsi käivitatavaid faile ARM-i ja ARM64 arhitektuuri jaoks. Lisatud tabeldusklahvi vajutades sisestuse automaatsel täitmisel pakutavate valikute kirjeldused.

  • Laiendatud LLD linkeri võimalused. Täiustatud ELF-vormingu tugi, sealhulgas glob-mallide täieliku ühilduvuse tagamine GNU linkeriga, tihendatud silumissektsioonide ".zdebug" toe lisamine, atribuudi PT_GNU_PROPERTY lisamine jaotise .note.gnu.property määratlemiseks (saab edaspidi kasutada Linuxi tuumad),
    Rakendatud on režiimid "-z noseparate-code", "-z eraldi kood" ja "-z eraldi laaditavad segmendid". Täiustatud tugi MinGW ja WebAssembly jaoks.

Allikas: opennet.ru

Lisa kommentaar