Az LLVM 12.0 fordítócsomag kiadása

Hat hónapos fejlesztés után bemutatták az LLVM 12.0 projekt kiadását - egy GCC-kompatibilis eszközkészletet (fordítók, optimalizálók és kódgenerátorok), amely a programokat RISC-szerű virtuális utasítások köztes bitkódjává fordítja (alacsony szintű virtuális gép többszintű optimalizáló rendszer). A generált pszeudokód JIT fordító segítségével gépi utasításokká konvertálható közvetlenül a program végrehajtása során.

Fejlesztések a Clang 12.0-ban:

  • A C++20 szabványban javasolt „valószínű” és „nem valószínű” attribútumok támogatása alapértelmezés szerint megvalósult és engedélyezve van, lehetővé téve az optimalizáló számára, hogy tájékozódjon a feltételes konstrukció aktiválásának valószínűségéről (például „[[valószínű ]] if (véletlen > 0) {“).
  • Hozzáadott támogatás az AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) és Intel Sapphire Rapids (-march=sapphirerapids) processzorokhoz.
  • A "-march=x86-64-v[234]" jelzők támogatása az x86-64 architektúra szintek kiválasztásához (v2 - SSE4.2, SSSE3, POPCNT és CMPXCHG16B kiterjesztések; v3 - AVX2 és MOVBE; v4 - AVX-512 ) .
  • Hozzáadott támogatás az Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) és Fujitsu A64FX (a64fx) processzorokhoz. Például a Neoverse-V1 CPU-k optimalizálásának engedélyezéséhez adja meg a „-mcpu=neoverse-v1” értéket.
  • Az AArch64 architektúrához új "-moutline-atomics" és "-mno-outline-atomics" fordítójelzők kerültek hozzáadásra, amelyek engedélyezik vagy letiltják az atomi műveleteket segítő funkciókat, mint például a "__aarch64_cas8_relax". Az ilyen funkciók futás közben észlelik, hogy elérhető-e az LSE (Large System Extensions) támogatás, és a mellékelt atomprocesszor-utasításokat használják, vagy visszatérnek az LL/SC (Load-link/store-conditional) utasítások használatához a szinkronizáláshoz.
  • A "-fbinutils-version" opció hozzáadva a binutils csomag célverziójának kiválasztásához a régebbi linker és assembler viselkedéssel való kompatibilitás érdekében.
  • Az ELF végrehajtható fájlok esetében, ha a "-gz" jelző meg van adva, a hibakeresési információk tömörítése a zlib könyvtár használatával alapértelmezés szerint engedélyezett (gz=zlib). Az eredményül kapott objektumfájlok összekapcsolásához lld vagy GNU binutils 2.26+ szükséges. A binutils régebbi verzióival való kompatibilitás visszaállításához adja meg a „-gz=zlib-gnu” értéket.
  • A 'this' mutatót most nonnull és dereferenceable(N) ellenőrzésekkel dolgozzuk fel. A nonnull attribútum eltávolításához, amikor NULL értékeket kell használnia, használja a "-fdelete-null-pointer-checks" opciót.
  • A Linux platformon a "-fasynchronous-unwind-tables" mód engedélyezve van az AArch64 és PowerPC architektúrák számára, hogy a GCC-hez hasonlóan letekercselő hívástáblákat generáljanak.
  • A "#pragma clang loop vectorize_width" hozzáadta a "fix" (alapértelmezett) és a "skálázható" opciók megadásának lehetőségét a vektorizálási módszer kiválasztásához. A vektorhossztól független "skálázható" mód kísérleti jellegű, és olyan hardveren használható, amely támogatja a skálázható vektorizálást.
  • Továbbfejlesztett támogatás a Windows platformhoz: Elkészültek az Arm64 rendszereken futó Windows hivatalos bináris összeállításai, beleértve a Clang fordítót, az LLD linkert és a compiler-rt futásidejű könyvtárakat. A MinGW célplatformokra való építésekor az .exe utótag hozzáadásra kerül, még keresztfordításkor is.
  • Az OpenCL, OpenMP és CUDA támogatásához kapcsolódó képességek kibővültek. A "-cl-std=CL3.0" és a "-cl-std=CL1.0" opciók hozzáadva az OpenCL 3.0 és az OpenCL 1.0 makróbeállításainak kiválasztásához. Bővültek a diagnosztikai eszközök.
  • Egyes x86-alapú processzorokban implementált HRESET, UINTR és AVXVNNI utasítások támogatása.
  • Az x86 rendszereken az "-mtune=" opció támogatása engedélyezett ", amely aktiválja a kiválasztott mikroarchitektúra optimalizációkat, függetlenül a "-march=" értékétől "
  • A statikus analizátor javított néhány POSIX-függvény feldolgozásán, és jelentősen javította a feltételes műveletek eredményének meghatározását, ha több szimbolikus érték is szerepel az összehasonlításban. Új ellenőrzések kerültek hozzáadásra: fuchia.HandleChecker (meghatározza a fogantyúkat a struktúrákban), webkit.UncountedLambdaCapturesChecker webkit és alpha.webkit.UncountedLocalVarsChecker (figyelembe veszi a mutatókkal való munkavégzés sajátosságait a WebKit motorkódban).
  • A konstansokkal összefüggésben használt kifejezésekben a __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __verse,bs_, __verse, _bs_s beépített függvények használata wap, __bswapd, __bswap64, megengedett. __bswapq , _castf*, __rol* és __ror*.
  • Hozzáadott egy BitFieldColonSpacing beállítást a clang-format segédprogramhoz az azonosítók, oszlopok és meződefiníciók közötti térköz kiválasztásához.
  • A Linux platformon lévő clangd gyorsítótárazó szerver (Clang Server) jelentősen csökkentette a memóriafelhasználást a hosszú távú működés során (a malloc_trim rendszeres hívása biztosítja a szabad memóriaoldalak visszajuttatását az operációs rendszerbe).

Az LLVM 12.0 legfontosabb újításai:

  • A Pythonban írt llvm-build build eszköz támogatása megszűnt, helyette a projekt teljesen átállt a CMake build rendszer használatára.
  • Az AArch64 architektúra háttérprogramjában továbbfejlesztették a Windows platform támogatását: biztosított az assembler kimenet megfelelő generálása a cél Windows rendszerekhez, optimalizálták az adatok generálását az unwind hívásokhoz (az ilyen adatok mérete 60-al csökkent). %), a .seh_* direktívák hozzáadásával az assembler használatával letekerhető adatok létrehozására is lehetőség nyílik.
  • A PowerPC architektúra hátterében új optimalizálások találhatók a ciklusokhoz és a soron belüli telepítéshez, a Power10 processzorok kibővített támogatása, a mátrixkezeléshez szükséges MMA utasítások támogatása, valamint az AIX operációs rendszer továbbfejlesztett támogatása.
  • Az x86-os háttérrendszer támogatja az AMD Zen 3, Intel Alder Lake és Intel Sapphire Rapids processzorokat, valamint a HRESET, UINTR és AVXVNNI processzorok utasításait. Az MPX (Memory Protection Extensions) támogatása a mutatók ellenőrzéséhez, hogy megbizonyosodjon arról, hogy a memóriahatárok már nem támogatottak (ez a technológia nem elterjedt, és már eltávolították a GCC-ből és a csengésből). Az assembler támogatása a {disp32} és {disp8} előtagokhoz, valamint a .d32 és .d8 utótagokhoz az operanduseltolások és ugrások méretének szabályozásához. Új „tune-cpu” attribútum hozzáadásával szabályozható a mikroarchitektúra optimalizálás.
  • Egy új „-fsanitize=unsigned-shift-base” mód került hozzáadásra az egész szám probléma érzékelőjéhez (integer sanitizer, „-fsanitize=integer”), hogy észlelje az előjel nélküli egész számok túlcsordulását egy kis balra tolódás után.
  • Különféle detektorokban (asan, cfi, lsan, msan, tsan, ubsan sanitizer) a Linux disztribúciók támogatása a szabványos Musl könyvtárral bővült.
  • Az LLD linker képességei kibővültek. Továbbfejlesztett támogatás az ELF formátumhoz, beleértve a „--dependency-file”, „-error-handling-script”, „-lto-pseudo-probe-for-profiling”, „-no-lto-whole-program” opciókat. -láthatóság"" Továbbfejlesztett MinGW támogatás. A Mach-O formátum (macOS) esetében az arm64, az arm és az i386 architektúrák támogatása, a link-time optimalizálás (LTO) és a verem feloldása a kivételkezeléshez került megvalósításra.
  • A Libc++ a C++20 szabvány új funkcióit valósítja meg, és megkezdte a C++2b specifikáció szolgáltatásainak fejlesztését. Támogatás hozzáadva a honosítási támogatás letiltásával történő építéshez („-DLIBCXX_ENABLE_LOCALIZATION=OFF”) és pszeudo-véletlen számok generálására szolgáló eszközökhöz („-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Forrás: opennet.ru

Hozzászólás