LLVM 11.0 kompilaatorikomplekti väljalase

Pärast kuuekuulist arengut esitatakse projekti vabastamine LLVM 11.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.

Peamine muudatus uues versioonis oli kaasamine Külg, Fortrani keele kasutajaliides. Flang toetab Fortran 2018, OpenMP 4.5 ja OpenACC 3.0, kuid projekti arendus pole veel lõppenud ning esiots piirdub koodi parsimise ja õigsuse kontrollimisega. LLVM-i vahekoodi genereerimist veel ei toetata ja käivitatavate failide genereerimiseks genereeritakse kanooniline kood ja edastatakse see välisele Fortrani kompilaatorile.

Parandused Clang 11.0-s:

  • Lisatud on võimalus taastada abstraktne süntaksipuu (AST) katkise C++ koodi jaoks, mida saab kasutada vigade diagnoosimiseks ja mis annab lisateavet välistele utiliitidele, nagu clang-tidy ja clangd. Funktsioon on C++ koodi jaoks vaikimisi lubatud ja seda juhitakse suvandite "-Xclang -f[no-]recovery-ast" kaudu.
  • Lisatud uued diagnostikarežiimid:
    • „-Wpointer-to-int-cast” on hoiatuste rühm täisarvu tüüpi int osutamise kohta, mis ei mahuta kõiki võimalikke väärtusi.
    • "-Wuninitialized-const-reference" – hoiatus initsialiseerimata muutujate edastamise kohta funktsiooni parameetrites, mis aktsepteerivad viiteargumente atribuudiga "const".
    • "-Wimplicit-const-int-float-conversion" – vaikimisi lubatud hoiatus tegeliku konstandi kaudse teisendamise kohta täisarvu tüübiks.
  • ARM-i platvormi jaoks pakutakse kompilaatorisse sisseehitatud C-funktsioone (Olemuslikud omadused), asendatud tõhusate vektorkäskudega Arm v8.1-M MVE ja CDE. Saadaolevad funktsioonid on määratletud päisefailides arm_mve.h ja arm_cde.h.
  • Lisatud laiendatud täisarvutüüpide komplekt _ExtInt(N), mis võimaldab teil luua tüüpe, mis ei ole kahe astme kordsed ja mida saab FPGA/HLS-is tõhusalt töödelda. Näiteks, _ExtInt(7) määratleb täisarvu tüübi, mis koosneb 7 bitist.
  • Lisatud makrod, mis määravad ARM SVE (Scalable Vector Extension) juhiste alusel toe sisseehitatud C-funktsioonidele:
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Näiteks makro __ARM_FEATURE_SVE määratletakse AArch64 koodi genereerimisel, määrates käsurea valiku "-march=armv8-a+sve".

  • Lipp "-O" on nüüd "-O1" asemel identifitseeritud optimeerimisrežiimiga "-O2".
  • Lisatud uued kompilaatori lipud:
    • "-fstack-clash-protection" - võimaldab kaitset virna ja kuhja ristumiskohad.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" – võimaldab valida ujukomaarvude jaoks erandikäsitleja režiimi.
    • "-ffp-model={precise,strict,fast}" – lihtsustab juurdepääsu ujukomaarvude erisuvanditele.
    • "-fpch-codegen" ja "-fpch-debuginfo", et luua eelkompileeritud päis (PCH) eraldi objektifailidega koodi ja silumisinfo jaoks.
    • “-fsanitize-coverage-allowlist” ja “-fsanitize-coverage-blocklist” valgete ja mustade nimekirjade leviala kontrollimiseks.
    • "-mtls-size={12,24,32,48}", et valida TLS-i (lõime kohalik salvestusruum) suurus.
    • "-menable-experimental-extension" eksperimentaalsete RISC-V laienduste lubamiseks.
  • C vaikerežiim on "-fno-common", mis võimaldab mõnel platvormil tõhusamat juurdepääsu globaalsetele muutujatele.
  • Mooduli vaikevahemälu on teisaldatud /tmp-st kataloogi ~/.cache. Alistamiseks võite kasutada lippu "-fmodules-cache-path=".
  • Vaikimisi C-keelestandard on uuendatud gnu11-lt gnu17-le.
  • Lisatud esialgne tugi GNU C laiendile "asm inline» monteerija lisade lisamiseks. Laiendust veel analüüsitakse, kuid seda ei töödelda kuidagi.
  • Laiendatud on OpenCL-i ja CUDA toega seotud võimalusi. Lisatud on OpenCL 2.0 plokidiagnostika tugi ja juurutatud uued OpenMP 5.0 funktsioonid.
  • Lisatud Clang-vormingu utiliidile suvand IndentExternBlock, et joondada väliste "C" ja väliste "C++" plokkidega.
  • Staatiline analüsaator on parandanud päritud konstruktorite käsitlemist C++ keeles. Lisatud on uued kontrollid alpha.core.C11Lock ja alpha.fuchsia.Lock lukkude kontrollimiseks, alpha.security.cert.pos.34c putenv, webkit.NoUncountedMemberChecker ja webkit.RefCntblBaseVirtualDtor, et tuvastada loendamatute tüüpidega seotud probleeme, alpha.XNUMXc .cplusplus .SmartPtr, et kontrollida, kas nutikursori viide on null.
  • Linteris kõlisev-korras lisatud suur osa uusi tšekke.
  • Clangdi vahemäluserver (Clang Server) on parandanud jõudlust ja lisanud uusi diagnostikavõimalusi.

Kõik uuendused LLVM 11.0:

  • Ehitamise süsteem on ümber lülitatud Python 3 kasutamisele. Kui Python 3 pole saadaval, on võimalik tagasi pöörduda Python 2 kasutamisele.
  • Go keele (llgo) kompilaatoriga esiosa on väljaandest välja jäetud, mida võidakse tulevikus ümber korraldada.
  • Intermediate representation (IR) atribuut vektor-funktsioon-abi-variant on lisatud kõnede vektoriseerimiseks skalaar- ja vektorfunktsioonide vahelise vastendamise kirjeldamiseks. Alates llvm::VectorType on kaks erinevat vektoritüüpi llvm::FixedVectorType ja llvm::ScalableVectorType.
  • Udefi väärtustel põhinev hargnemine ja undef väärtuste edastamine standardsetele teegifunktsioonidele loetakse määratlemata käitumiseks. IN
    memset/memcpy/memmove lubab undef osutite edastamist, kuid kui parameeter suurusega on null.

  • LLJIT on lisanud toe staatiliste lähtestuste tegemiseks LLJIT::initialize ja LLJIT::deinitialize meetodite kaudu. Rakendatud on võimalus lisada JITDylibile staatilisi teeke, kasutades StaticLibraryDefinitionGenerator klassi. Lisatud C API jaoks ORCv2 (API JIT-kompilaatorite ehitamiseks).
  • AArch64 arhitektuuri taustaprogrammi on lisatud Cortex-A34, Cortex-A77, Cortex-A78 ja Cortex-X1 protsessorite tugi. Rakendatud ARMv8.2-BF16 (BFloat16) ja ARMv8.6-A laiendused, sealhulgas RMv8.6-ECV (täiustatud loenduri virtualiseerimine), ARMv8.6-FGT (peeneteraline lõks), ARMv8.6-AMU (aktiivsusmonitori virtualiseerimine) ja ARMv8.0-DGH (vihje andmete kogumiseks). Pakutakse võimalust luua koodi sisseehitatud funktsioonide jaoks, mis on seotud SVE vektorkäskudega.
  • ARM-arhitektuuri taustaprogrammi on lisatud Cortex-M55, Cortex-A77, Cortex-A78 ja Cortex-X1 protsessorite tugi. Laiendused rakendatud
    Armv8.6-A Matrix Multiply ja RMv8.2-AA32BF16 BFloat16.

  • PowerPC arhitektuuri taustaprogrammi on lisatud POWER10 protsessorite koodi genereerimise tugi. Silmuse optimeerimist on laiendatud ja ujukoma tuge on täiustatud.
  • RISC-V arhitektuuri taustaprogramm võimaldab aktsepteerida plaastreid, mis toetavad eksperimentaalseid laiendatud käsukomplekte, mis pole veel ametlikult heaks kiidetud.
  • AVR-i arhitektuuri taustaprogramm on viidud eksperimentaalsest kategooriast stabiilseks, mis sisaldub põhidistributsioonis.
  • x86 arhitektuuri taustaprogramm toetab Intel AMX ja TSXLDTRK juhiseid. Lisatud kaitse rünnakute eest LVI (Load Value Injection) ja rakendab ka üldist spekulatiivse täitmise kõrvalmõjude summutamise mehhanismi, et blokeerida rünnakud, mis on põhjustatud CPU operatsioonide spekulatiivsest täitmisest.
  • SystemZ-i arhitektuuri taustaprogrammi on lisatud MemorySanitizeri ja LeakSanitizeri tugi.
  • Libc++-le on lisatud matemaatiliste konstantidega päisefaili tugi .
  • Laiendatud LLD linkeri võimalused. Täiustatud tugi ELF-vormingule, sealhulgas lisatud valikud "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unikaalne", "-rosegment", "-threads=N". Lisatud on suvand "--time-trace", et salvestada jälg faili, mida saab seejärel analüüsida Chrome'i liidese chrome://tracing kaudu.

Allikas: opennet.ru

Lisa kommentaar