Vydanie sady kompilátorov LLVM 12.0

Po šiestich mesiacoch vývoja bolo predstavené vydanie projektu LLVM 12.0 - GCC-kompatibilný toolkit (kompilátory, optimalizátory a generátory kódu), ktorý kompiluje programy do stredného bitového kódu virtuálnych inštrukcií podobných RISC (nízkoúrovňový virtuálny stroj s viacúrovňový optimalizačný systém). Vygenerovaný pseudokód je možné previesť pomocou JIT kompilátora na strojové inštrukcie priamo v čase vykonávania programu.

Vylepšenia v Clang 12.0:

  • Podpora pre atribúty „pravdepodobné“ a „nepravdepodobné“ navrhované v štandarde C++20 bola implementovaná a povolená štandardne, čo umožňuje optimalizátorovi získať informácie o pravdepodobnosti spustenia podmieneného konštruktu (napríklad „[[pravdepodobné ]] ak (náhodné > 0) {“).
  • Pridaná podpora pre procesory AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) a Intel Sapphire Rapids (-march=sapphirerapids).
  • Pridaná podpora pre príznaky "-march=x86-64-v[234]" na výber úrovní architektúry x86-64 (v2 - pokrýva rozšírenia SSE4.2, SSSE3, POPCNT a CMPXCHG16B; v3 - AVX2 a MOVBE; v4 - AVX-512 ).
  • Pridaná podpora pre procesory Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) a Fujitsu A64FX (a64fx). Ak chcete napríklad povoliť optimalizáciu pre procesory Neoverse-V1, môžete zadať „-mcpu=neoverse-v1“.
  • Pre architektúru AArch64 boli pridané nové príznaky kompilátora "-moutline-atomics" a "-mno-outline-atomics" na povolenie alebo zakázanie pomocných funkcií atómovej operácie, ako napríklad "__aarch64_cas8_relax". Takéto funkcie za behu zisťujú, či je k dispozícii podpora LSE (Large System Extensions) a používajú poskytnuté inštrukcie pre atómový procesor alebo sa vrátia k používaniu inštrukcií LL/SC (Load-link/store-conditional) na synchronizáciu.
  • Pridaná možnosť "-fbinutils-version" na výber cieľovej verzie balíka binutils pre kompatibilitu so starším správaním linkera a assembleru.
  • Pre spustiteľné súbory ELF, keď je zadaný príznak „-gz“, je predvolene povolená kompresia ladiacich informácií pomocou knižnice zlib (gz=zlib). Prepojenie výsledných objektových súborov vyžaduje lld alebo GNU binutils 2.26+. Ak chcete obnoviť kompatibilitu so staršími verziami binutils, môžete zadať "-gz=zlib-gnu".
  • Ukazovateľ 'tento' je teraz spracovaný s kontrolami bez nuly a odreferencovania (N). Ak chcete odstrániť atribút nonnull, ak potrebujete použiť hodnoty NULL, môžete použiť voľbu "-fdelete-null-pointer-checks".
  • Na platforme Linux je pre architektúry AArch64 a PowerPC povolený režim „-fasynchronous-unwind-tables“ na generovanie tabuliek volaní, ako v GCC.
  • V "#pragma clang loop vectorize_width" bola pridaná možnosť špecifikovať možnosti "fixed" (predvolené) a "scalable" na výber metódy vektorizácie. „Scalable“ režim, nezávislý od dĺžky vektora, je experimentálny a môže byť použitý na hardvéri, ktorý podporuje škálovateľnú vektorizáciu.
  • Vylepšená podpora pre platformu Windows: Boli pripravené oficiálne binárne zostavy pre Windows na systémoch Arm64, vrátane kompilátora Clang, LLD linkeru a runtime knižníc kompilátora-rt. Pri vytváraní pre cieľové platformy MinGW sa pridáva prípona .exe, a to aj pri krížovej kompilácii.
  • Rozšírili sa možnosti spojené s podporou OpenCL, OpenMP a CUDA. Pridané voľby "-cl-std=CL3.0" a "-cl-std=CL1.0" na výber možností makra pre OpenCL 3.0 a OpenCL 1.0. Diagnostické nástroje boli rozšírené.
  • Pridaná podpora pre inštrukcie HRESET, UINTR a AVXVNNI implementované v niektorých procesoroch založených na x86.
  • Na systémoch x86 je povolená podpora pre voľbu "-mtune=", ktorá umožňuje vybrané mikroarchitektonické optimalizácie bez ohľadu na hodnotu "-march=".
  • Statický analyzátor má vylepšené spracovanie niektorých funkcií POSIX a výrazne zlepšilo určovanie výsledku podmienených operácií, keď je v porovnaní niekoľko symbolických hodnôt. Pribudli nové kontroly: fuchia.HandleChecker (definuje úchopy v štruktúrach), webkit.UncountedLambdaCapturesChecker a alpha.webkit.UncountedLocalVarsChecker (zohľadňuje zvláštnosti práce s ukazovateľmi v kóde motora WebKit).
  • Vo výrazoch používaných v kontexte konštánt je použitie vstavaných funkcií __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __verse,_bs,_rb_scan_re pd, __bswap64, __ je povolené bswapq , _castf*, __rol* a __ror*.
  • Do nástroja clang-format bola pridaná možnosť BitFieldColonSpacing na výber medzier okolo identifikátorov, stĺpcov a definícií polí.
  • Clangd caching server (Clang Server) na platforme Linux výrazne znížil spotrebu pamäte počas dlhodobej prevádzky (periodické volania malloc_trim sú poskytované na vrátenie voľných pamäťových stránok do operačného systému).

Kľúčové inovácie v LLVM 12.0:

  • Podpora pre zostavovací nástroj llvm-build napísaný v Pythone bola ukončená a namiesto toho projekt úplne prešiel na používanie systému zostavovania CMake.
  • V backende pre architektúru AArch64 bola vylepšená podpora pre platformu Windows: zabezpečilo sa správne generovanie výstupu assembleru pre cieľové systémy Windows, optimalizovalo sa generovanie údajov o unwind calloch (veľkosť takýchto údajov sa znížila o 60 %), možnosť vytvárať odvíjacie dáta pomocou assembleru boli pridané direktívy .seh_*.
  • Backend pre architektúru PowerPC obsahuje nové optimalizácie pre slučky a inline nasadenie, rozšírenú podporu pre procesory Power10, pridanú podporu inštrukcií MMA pre manipuláciu s maticami a vylepšenú podporu pre operačný systém AIX.
  • Backend x86 pridáva podporu pre procesory AMD Zen 3, Intel Alder Lake a Intel Sapphire Rapids, ako aj inštrukcie pre procesory HRESET, UINTR a AVXVNNI. Podpora pre MPX (Memory Protection Extensions) na kontrolu ukazovateľov, aby sa zabezpečilo, že hranice pamäte už nie sú podporované (táto technológia nie je rozšírená a už bola odstránená z GCC a clang). Do assembleru bola pridaná podpora pre predpony {disp32} a {disp8} a prípony .d32 a .d8 na ovládanie veľkosti posunov a skokov operandov. Pridaný nový atribút „tune-cpu“ na ovládanie zahrnutia mikroarchitektonických optimalizácií.
  • Do detektora problémov s celými číslami (integer sanitizer, „-fsanitize=integer“) bol pridaný nový režim „-fsanitize=unsigned-shift-base“ na detekciu pretečenia celých čísel bez znamienka po miernom posune doľava.
  • V rôznych detektoroch (asan, cfi, lsan, msan, tsan, ubsan sanitizer) pribudla podpora pre linuxové distribúcie so štandardnou knižnicou Musl.
  • Možnosti LLD linkera boli rozšírené. Vylepšená podpora pre formát ELF, vrátane pridaných možností „--dependency-file“, „-error-handling-script“, „-lto-pseudo-probe-for-profiling“, „-no-lto-whole-program“ -viditeľnosť"" Vylepšená podpora MinGW. Pre formát Mach-O (macOS) bola implementovaná podpora pre architektúry arm64, arm a i386, optimalizácie doby prepojenia (LTO) a odvíjanie zásobníka na spracovanie výnimiek.
  • Libc++ implementuje nové funkcie štandardu C++20 a začal vývoj funkcií špecifikácie C++2b. Pridaná podpora pre zostavovanie so zakázaním podpory lokalizácie (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) a zariadení na generovanie pseudonáhodných čísel (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Zdroj: opennet.ru

Pridať komentár