LLVM 12.0 kompilaatorikomplekti väljalase

Pärast kuuekuulist arendustööd esitleti projekti LLVM 12.0 väljalaset – GCC-ga ühilduvat tööriistakomplekti (kompilaatorid, optimeerijad ja koodigeneraatorid), mis kompileerib programmid RISC-laadsete virtuaalsete käskude vahepealsesse bitikoodi (madala tasemega virtuaalmasin mitmetasandiline optimeerimissüsteem). Loodud pseudokoodi saab JIT-kompilaatori abil teisendada masinakäskudeks vahetult programmi täitmise ajal.

Clang 12.0 täiustused:

  • C++20 standardis pakutud atribuutide "tõenäoline" ja "ebatõenäoline" tugi on vaikimisi juurutatud ja lubatud, võimaldades optimeerijal saada teavet tingimusliku konstruktsiooni käivitamise tõenäosuse kohta (näiteks "[[tõenäoline" ]] if (juhuslik > 0) {“).
  • Lisatud on tugi AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) ja Intel Sapphire Rapids (-march=sapphirerapids) protsessoritele.
  • Lisatud on tugi lippudele "-march=x86-64-v[234]", et valida x86-64 arhitektuuritasemed (v2 – hõlmab laiendusi SSE4.2, SSSE3, POPCNT ja CMPXCHG16B; v3 – AVX2 ja MOVBE; v4 – AVX-512 ) .
  • Lisatud on tugi Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) ja Fujitsu A64FX (a64fx) protsessoritele. Näiteks Neoverse-V1 protsessorite optimeerimise lubamiseks võite määrata "-mcpu=neoverse-v1".
  • AArch64 arhitektuuri jaoks on lisatud uued kompilaatori lipud "-moutline-atomics" ja "-mno-outline-atomics", et lubada või keelata aatomitoimingute abifunktsioone, näiteks "__aarch64_cas8_relax". Sellised funktsioonid tuvastavad käitusajal, kas LSE (Large System Extensions) tugi on saadaval, ja kasutavad kaasasolevaid atomaarse protsessori juhiseid või kasutavad sünkroonimiseks LL/SC (Load-link/store-conditional) juhiseid.
  • Lisatud suvand "-fbinutils-version", et valida binutilsi komplekti sihtversioon, et see ühilduks vanema linkeri ja komplekteerija käitumisega.
  • Kui ELF-i käivitatavate failide puhul on määratud lipp "-gz", on silumisandmete tihendamine zlib-teegi abil vaikimisi lubatud (gz=zlib). Saadud objektifailide linkimiseks on vaja versiooni lld või GNU binutils 2.26+. Ühilduvuse taastamiseks binutilli vanemate versioonidega saate määrata "-gz=zlib-gnu".
  • "See" osutit töödeldakse nüüd tühistamata ja viideta (N) kontrollidega. Kui teil on vaja kasutada NULL-väärtusi, võite atribuudi nonnull eemaldamiseks kasutada suvandit "-fdelete-null-pointer-checks".
  • Linuxi platvormil on AArch64 ja PowerPC arhitektuuride jaoks lubatud režiim "-fasynchronous-unwind-tables", et genereerida lahtikerimise kõnetabeleid, nagu GCC-s.
  • Jaotises "#pragma clang loop vectorize_width" lisati võimalus määrata vektoriseerimismeetodi valimiseks "fikseeritud" (vaikimisi) ja "skaleeritav". "Skaleeritav" režiim, mis ei sõltu vektori pikkusest, on eksperimentaalne ja seda saab kasutada riistvaras, mis toetab skaleeritavat vektoriseerimist.
  • Täiustatud tugi Windowsi platvormile: Arm64 süsteemide Windowsi jaoks on ette valmistatud ametlikud binaarkomplektid, sealhulgas Clangi kompilaator, LLD linker ja kompilaatori-rt käitusaja teegid. MinGW sihtplatvormidele ehitamisel lisatakse .exe-liide, isegi ristkompileerimisel.
  • Laiendatud on OpenCLi, OpenMP ja CUDA toega seotud võimalusi. Lisatud suvandid "-cl-std=CL3.0" ja "-cl-std=CL1.0", et valida OpenCL 3.0 ja OpenCL 1.0 makrosuvandid. Diagnostikavahendeid on laiendatud.
  • Lisatud on mõnes x86-põhises protsessoris rakendatud HRESET-, UINTR- ja AVXVNNI-juhiste tugi.
  • x86 süsteemides on suvandi "-mtune=" tugi lubatud ", mis aktiveerib valitud mikroarhitektuuri optimeerimised, olenemata "-march=" väärtusest "
  • Staatiline analüsaator on parandanud mõne POSIX-i funktsiooni töötlemist ja oluliselt parandanud tingimustoimingute tulemuse määramist, kui võrdluses on mitu sümboolset väärtust. Lisatud on uued kontrollid: fuchia.HandleChecker (defineerib käepidemed struktuurides), webkit.UncountedLambdaCapturesChecker veebikomplekt ja alpha.webkit.UncountedLocalVarsChecker (arvestab WebKiti mootori koodis osutitega töötamise iseärasusi).
  • Konstantide kontekstis kasutatavates avaldistes kasutatakse sisseehitatud funktsioone __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __verse,bs_, _bsfq, __verse,bs_s wap, __bswapd, __bswap64, on lubatud. __bswapq , _castf*, __rol* ja __ror*.
  • Lisati klangivormingu utiliidile suvand BitFieldColonSpacing, et valida identifikaatorite, veergude ja väljade määratluste ümber vahekaugus.
  • Linuxi platvormil asuv clangd vahemäluserver (Clang Server) on pikaajalise töö käigus oluliselt vähendanud mälutarbimist (operatsioonisüsteemi vabade mälulehtede tagastamiseks pakutakse perioodilisi kõnesid malloc_trim).

LLVM 12.0 peamised uuendused:

  • Pythonis kirjutatud ehitustööriista llvm-build tugi on lõpetatud ja selle asemel on projekt täielikult üle läinud CMake ehitussüsteemi kasutamisele.
  • AArch64 arhitektuuri taustaprogrammis on täiustatud Windowsi platvormi tuge: tagatud on siht-Windowsi süsteemide jaoks õige assembleri väljundi genereerimine, optimeeritud on lahtikerimise kõnede andmete genereerimine (selliste andmete suurust on vähendatud 60 võrra). %), on lisatud käskkirjad .seh_* võimalus luua andmeid lahti kerida, kasutades assemblerit.
  • PowerPC-arhitektuuri taustaprogramm sisaldab uusi optimeerimisi silmuste ja sisemise juurutamise jaoks, Power10 protsessorite laiendatud tuge, maatriksiga manipuleerimise MMA-juhiste täiendavat tuge ja AIX-i operatsioonisüsteemi täiustatud tuge.
  • x86 taustaprogramm lisab AMD Zen 3, Intel Alder Lake'i ja Intel Sapphire Rapidsi protsessorite toe ning HRESET, UINTR ja AVXVNNI protsessori juhised. MPX-i (mälukaitselaiendite) tugi, et kontrollida viiteid, tagamaks, et mälupiire enam ei toetata (see tehnoloogia pole laialt levinud ja see on juba GCC-st ja helinast eemaldatud). Assemblerile on lisatud tugi prefiksite {disp32} ja {disp8} ning järelliidete .d32 ja d8 jaoks, et juhtida operandi nihke ja hüppe suurust. Lisati uus atribuut "tune-cpu", et juhtida mikroarhitektuuri optimeerimiste kaasamist.
  • Täisarvuprobleemide detektorisse (täisarvude desinfitseerimisseade, -fsanitize=täisarv) on lisatud uus režiim "-fsanitize=unsigned-shift-base", et tuvastada märgita täisarvude ületäitumine pärast natuke vasakule nihutamist.
  • Erinevatesse detektoritesse (asan, cfi, lsan, msan, tsan, ubsan sanitizer) on lisatud standardse Musli teegiga Linuxi distributsioonide tugi.
  • LLD linkeri võimalusi on laiendatud. ELF-vormingu täiustatud tugi, sealhulgas lisatud valikud "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program" -nähtavus"" Täiustatud MinGW tugi. Mach-O vormingu (macOS) jaoks on rakendatud arm64, arm ja i386 arhitektuuride tugi, lingiaja optimeerimine (LTO) ja virna lahtikerimine erandite käsitlemiseks.
  • Libc++ rakendab C++20 standardi uusi funktsioone ja on alustanud spetsifikatsiooni C++2b funktsioonide väljatöötamist. Lisatud on lokaliseerimistoe keelamisega ehitamise tugi (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) ja seadmed pseudojuhuslike numbrite genereerimiseks (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Allikas: opennet.ru

Lisa kommentaar