Az LLVM 15.0 fordítócsomag kiadása

Hat hónapos fejlesztés után bemutatták az LLVM 15.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.

Főbb fejlesztések a Clang 15.0-ban:

  • Az x86 architektúrán alapuló rendszerek esetében hozzáadásra került a „-fzero-call-used-regs” jelző, amely biztosítja, hogy a függvényben használt összes CPU regiszter nullára álljon vissza, mielőtt visszaadná a vezérlést a függvényből. Ezzel az opcióval védekezhet a funkciókból származó információszivárgás ellen, és körülbelül 20%-kal csökkentheti a ROP (Return-Oriented Programming) modulok építésére alkalmas blokkok számát az exploitokban.
  • Megvalósult a C kódhoz tartozó struktúrák memóriaelhelyezésének véletlenszerűsítése, ami megnehezíti az adatok kinyerését a struktúrákból a sebezhetőségek kihasználása esetén. A véletlenszerűsítés be- és kikapcsolása a randomize_layout és a no_randomize_layout attribútumok használatával történik, és a "-frandomize-layout-seed" vagy a "-frandomize-layout-seed-file" jelzővel kell beállítani.
  • "-fstrict-flex-arrays=" jelző hozzáadva ", amellyel a struktúrákban lévő rugalmas tömbelemek határait szabályozhatja (Flexible Array Members, határozatlan méretű tömb a struktúra végén). Ha 0-ra van állítva (alapértelmezett), a struktúra utolsó eleme tömbbel mindig rugalmas tömbként kerül feldolgozásra, 1 - csak a [], [0] és [1] méretek feldolgozása rugalmas tömbként, 2 - csak a méretek A [] és [0] feldolgozása rugalmas tömbként történik.
  • Kísérleti támogatás hozzáadva a C-szerű HLSL (High-Level Shader Language) nyelvhez, amelyet a DirectX-ben árnyékolók írásához használnak.
  • A "-Warray-parameter" hozzáadva a rögzített és változó hosszúságú tömbökhöz társított inkompatibilis argumentumdeklarációkkal kapcsolatos felülbírálásra figyelmeztető függvényekre.
  • Továbbfejlesztett kompatibilitás az MSVC-vel. Az MSVC-ben biztosított "#pragma függvény" (a fordító számára függvényhívás létrehozására utasítja a soron belüli bővítést) és a "#pragma alloc_text" (meghatározza a szakasz nevét a függvénykóddal) támogatása. Az MSVC-kompatibilis /JMC és /JMC jelzők támogatása hozzáadva.
  • Továbbra is folyik a munka a jövőbeni C2X és C++23 szabványok támogatásán. A C nyelv esetében a következők vannak megvalósítva: a noreturn attribútum, a false és true kulcsszavak, a _BitInt(N) típus adott bitmélységű egész számokhoz, *_WIDTH makrók, az u8 előtag az UTF-8 kódolású karakterekhez.

    A C++ esetében a következők vannak megvalósítva: modulösszevonás, függvénytagok ABI-izolálása, nem lokális változók rendezett dinamikus inicializálása modulokban, többdimenziós index-operátorok, auto(x), nem literális változók, goto és címkék constexpr-ként deklarált függvényekben , elválasztott escape szekvenciák, elnevezett escape karakterek.

  • Kibővültek az OpenCL és OpenMP támogatáshoz kapcsolódó képességek. Támogatás hozzáadva a cl_khr_subgroup_rotate OpenCL-bővítményhez.
  • Az x86 architektúra esetében a processzorok sérülékenységei elleni védelem került hozzáadásra, amelyeket az utasítások spekulatív végrehajtása okoz feltétel nélküli előreugrási műveletek után. A probléma az utasítások megelőző feldolgozása miatt jelentkezik, közvetlenül a memóriában lévő elágazási utasítást követően (SLS, egyenes vonalú spekuláció). A védelem engedélyezéséhez a „-mharden-sls=[none|all|return|indirect-jmp]” opció javasolt.
  • Az SSE2 bővítményt támogató platformokon a _Float16 típus került hozzáadásra, amely az AVX512-FP16 utasítások támogatásának hiányában a float típussal emulálódik.
  • "-m[no-]rdpru" jelző hozzáadva az RDPRU utasítás használatának vezérléséhez, az AMD Zen2 processzoroktól kezdve támogatott.
  • A RETBLEED sebezhetőség elleni védelem érdekében hozzáadtuk a "-mfunction-return=thunk-extern" jelzőt, amely egy olyan utasítássorozat hozzáadásával működik, amely kizárja a közvetett ágak spekulatív végrehajtási mechanizmusának részvételét.

Az LLVM 15.0 legfontosabb újításai:

  • Hozzáadott támogatás a Cortex-M85 CPU, Armv9-A, Armv9.1-A és Armv9.2-A architektúrákhoz, Armv8.1-M PACBTI-M bővítményekhez.
  • A DirectX-hez egy kísérleti háttérprogram került hozzáadásra, amely támogatja a DirectX shaderekhez használt DXIL (DirectX Intermediate Language) formátumot. A háttérrendszer a „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” paraméter megadásával engedélyezhető az összeállítás során.
  • A Libc++ folytatja a C++20 és C++2b szabványok új funkcióinak megvalósítását, beleértve a „formátum” könyvtár megvalósításának befejezését és a „tartományok” könyvtár javasolt kísérleti verzióját.
  • Továbbfejlesztett háttérrendszerek x86, PowerPC és RISC-V architektúrákhoz.
  • Az LLD linker és az LLDB hibakereső képességeit továbbfejlesztették.

Forrás: opennet.ru

Hozzászólás