LLVM 12.0 kompiliatoriaus rinkinio išleidimas

Po šešių mėnesių kūrimo buvo pristatytas LLVM 12.0 projekto leidimas – su GCC suderinamas įrankių rinkinys (kompiliatoriai, optimizatoriai ir kodų generatoriai), kuris programas kompiliuoja į tarpinį RISC tipo virtualių komandų bitų kodą (žemo lygio virtuali mašina su kelių lygių optimizavimo sistema). Sukurtas pseudokodas gali būti konvertuojamas naudojant JIT kompiliatorių į mašinos komandas tiesiogiai programos vykdymo metu.

„Clang 12.0“ patobulinimai:

  • „Tikėtina“ ir „netikėtina“ atributų, siūlomų C++20 standarte, palaikymas įdiegtas ir įgalintas pagal numatytuosius nustatymus, todėl optimizatorius gali būti informuojamas apie sąlyginės konstrukcijos suaktyvinimo tikimybę (pvz., „[[tikėtina ]] if (atsitiktinis > 0) {“).
  • Pridėtas AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) ir Intel Sapphire Rapids (-march=sapphirerapids) procesorių palaikymas.
  • Pridėtas vėliavėlių „-march=x86-64-v[234]“ palaikymas, kad būtų galima pasirinkti x86-64 architektūros lygius (v2 – apima SSE4.2, SSSE3, POPCNT ir CMPXCHG16B plėtinius; v3 – AVX2 ir MOVBE; v4 – AVX-512 ).
  • Pridėtas Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) ir Fujitsu A64FX (a64fx) procesorių palaikymas. Pavyzdžiui, norėdami įgalinti Neoverse-V1 procesorių optimizavimą, galite nurodyti „-mcpu=neoverse-v1“.
  • AArch64 architektūrai buvo pridėtos naujos kompiliatoriaus vėliavėlės „-moutline-atomics“ ir „-mno-outline-atomics“, kad būtų įjungtos arba išjungtos atominės operacijos pagalbinės funkcijos, pvz., „__aarch64_cas8_relax“. Tokios funkcijos vykdymo metu nustato, ar galimas LSE (Large System Extensions) palaikymas, ir naudoja pateiktas atominio procesoriaus instrukcijas arba grįžta prie LL/SC (Load-link/store-conditional) sinchronizavimo instrukcijų.
  • Pridėta parinktis „-fbinutils-version“, kad būtų galima pasirinkti tikslinę „binutils“ rinkinio versiją, kad būtų galima suderinti su senesniu susiejimo ir surinkėjo elgesiu.
  • ELF vykdomiesiems failams, kai nurodyta vėliavėlė "-gz", derinimo informacijos glaudinimas naudojant zlib biblioteką yra įjungtas pagal numatytuosius nustatymus (gz=zlib). Norint susieti gautus objekto failus, reikia lld arba GNU binutils 2.26+. Norėdami atkurti suderinamumą su senesnėmis binutils versijomis, galite nurodyti "-gz=zlib-gnu".
  • „Šis“ žymeklis dabar apdorojamas naudojant „nenull“ ir „dereferenceable(N)“ patikras. Jei norite pašalinti atributą nonnull, kai reikia naudoti NULL reikšmes, galite naudoti parinktį „-fdelete-null-pointer-checks“.
  • „Linux“ platformoje „-fasynchronous-unwind-tables“ režimas įjungtas AArch64 ir PowerPC architektūroms, kad būtų galima generuoti išvyniojimo skambučių lenteles, kaip GCC.
  • „#pragma clang loop vectorize_width“ pridėta galimybė nurodyti „fiksuotas“ (numatytasis) ir „scalable“ parinktis, kad būtų galima pasirinkti vektorizavimo metodą. „Mastelio keitimo“ režimas, nepriklausomas nuo vektoriaus ilgio, yra eksperimentinis ir gali būti naudojamas aparatinėje įrangoje, kuri palaiko keičiamo dydžio vektorizavimą.
  • Pagerintas Windows platformos palaikymas: parengti oficialūs dvejetainiai rinkiniai, skirti Windows Arm64 sistemose, įskaitant Clang kompiliatorių, LLD linkerį ir kompiliatoriaus-rt vykdymo bibliotekas. Kuriant MinGW tikslinėms platformoms, pridedama priesaga .exe, net ir atliekant kryžminį kompiliavimą.
  • Su OpenCL, OpenMP ir CUDA palaikymu susijusios galimybės buvo išplėstos. Pridėtos parinktys „-cl-std=CL3.0“ ir „-cl-std=CL1.0“, kad būtų galima pasirinkti „OpenCL 3.0“ ir „OpenCL 1.0“ makrokomandas. Diagnostikos priemonės buvo išplėstos.
  • Pridėtas HRESET, UINTR ir AVXVNNI instrukcijų palaikymas, įdiegtas kai kuriuose x86 procesoriuose.
  • X86 sistemose įgalintas parinkties „-mtune=“ palaikymas, įgalinantis pasirinktus mikroarchitektūrinius optimizavimus, neatsižvelgiant į „-march=“ reikšmę.
  • Statinis analizatorius pagerino kai kurių POSIX funkcijų apdorojimą ir žymiai pagerino sąlyginių operacijų rezultato nustatymą, kai palyginime yra kelios simbolinės reikšmės. Pridėtos naujos patikros: fuchia.HandleChecker (apibrėžia rankenas struktūrose), webkit.UncountedLambdaCapturesChecker webkit ir alpha.webkit.UncountedLocalVarsChecker (atsižvelgiama į darbo su rodyklėmis ypatumus WebKit variklio kode).
  • Konstantų kontekste naudojamose išraiškose naudojamos integruotos funkcijos __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __reverse,bbs_, __verseqs_ __bswapd, __bswap64, __ leidžiama bswapq , _castf*, __rol* ir __ror*.
  • Prie clang formato įrankio pridėta parinktis BitFieldColonSpacing, kad būtų galima pasirinkti tarpą tarp identifikatorių, stulpelių ir laukų apibrėžimų.
  • „Clangd“ talpyklos serveris („Clang Server“) „Linux“ platformoje ženkliai sumažino atminties suvartojimą ilgalaikio veikimo metu (periodiškai iškviečiami malloc_trim, kad būtų grąžinti laisvos atminties puslapiai į operacinę sistemą).

Pagrindinės LLVM 12.0 naujovės:

  • Python parašyto llvm-build kūrimo įrankio palaikymas buvo nutrauktas, o vietoj to projektas buvo visiškai perkeltas į CMake kūrimo sistemą.
  • AArch64 architektūros užpakalinėje programoje patobulintas Windows platformos palaikymas: užtikrintas teisingas asemblerio išvesties generavimas tikslinėms Windows sistemoms, optimizuotas duomenų generavimas apie išvyniojimo skambučius (tokių duomenų dydis sumažintas 60 kartų). %), buvo pridėta direktyvų .seh_* galimybė sukurti išvynioti duomenis naudojant asemblerį.
  • „PowerPC“ architektūros užpakalinėje programoje yra nauji ciklų ir tiesioginio diegimo optimizavimai, išplėstas „Power10“ procesorių palaikymas, papildomas MMA instrukcijų palaikymas, skirtas manipuliuoti matrica, ir patobulintas AIX operacinės sistemos palaikymas.
  • x86 backend prideda AMD Zen 3, Intel Alder Lake ir Intel Sapphire Rapids procesorių palaikymą, taip pat HRESET, UINTR ir AVXVNNI procesorių instrukcijas. MPX (Memory Protection Extensions) palaikymas, skirtas tikrinti rodykles, siekiant užtikrinti, kad atminties ribos nebepalaikomos (ši technologija nėra plačiai paplitusi ir jau pašalinta iš GCC ir skambėjimo). Prie surinkėjo pridėtas prefiksų {disp32} ir {disp8} bei .d32 ir .d8 priesagų palaikymas, skirtas operandų poslinkių ir šuolių dydžiui valdyti. Pridėtas naujas atributas „tune-cpu“, kad būtų galima valdyti mikroarchitektūrinių optimizacijų įtraukimą.
  • Naujas režimas „-fsanitize=unsigned-shift-base“ buvo įtrauktas į sveikųjų skaičių problemų detektorių (sveikasis skaičius sanitizer, „-fsanitize=integer“), kad būtų galima aptikti nežymių sveikųjų skaičių perpildymą šiek tiek pasislinkus į kairę.
  • Įvairiuose detektoriuose (asan, cfi, lsan, msan, tsan, ubsan sanitizer) buvo pridėtas Linux platinimų palaikymas su standartine Musl biblioteka.
  • LLD linkerio galimybės buvo išplėstos. Patobulintas ELF formato palaikymas, įskaitant papildomas parinktis „--dependency-file“, „-error-handling-script“, „-lto-pseudo-probe-for-profiling“, „-no-lto-whole-program“ -matomumas"" Patobulintas MinGW palaikymas. Mach-O formatui (macOS) įdiegtas arm64, arm ir i386 architektūrų palaikymas, susiejimo laiko optimizavimas (LTO) ir dėklo išvyniojimas, kad būtų galima tvarkyti išimtis.
  • Libc++ įdiegia naujas C++20 standarto funkcijas ir pradėjo kurti C++2b specifikacijos funkcijas. Pridėtas kūrimo palaikymas išjungiant lokalizacijos palaikymą („-DLIBCXX_ENABLE_LOCALIZATION=OFF“) ir įrenginiai pseudoatsitiktiniams numeriams generuoti („-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF“).

Šaltinis: opennet.ru

Добавить комментарий