LLVM 15.0 kompiliatoriaus rinkinio išleidimas

Po šešių mėnesių kūrimo buvo pristatytas LLVM 15.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.

Pagrindiniai „Clang 15.0“ patobulinimai:

  • Sistemose, pagrįstose x86 architektūra, buvo pridėta vėliavėlė „-fzero-call-used-regs“, kuri užtikrina, kad visi funkcijoje naudojami procesoriaus registrai būtų iš naujo nustatyti į nulį prieš grąžinant funkcijos valdymą. Ši parinktis leidžia apsisaugoti nuo informacijos nutekėjimo iš funkcijų ir maždaug 20% ​​sumažinti blokų, tinkamų kurti ROP (Return-Oriented Programming) programėles, skaičių.
  • Įdiegtas C kodui skirtų struktūrų išdėstymo atmintyje atsitiktinis nustatymas, kuris apsunkina duomenų ištraukimą iš struktūrų pažeidžiamumų išnaudojimo atveju. Atsitiktinis režimas įjungiamas ir išjungiamas naudojant randomize_layout ir no_randomize_layout atributus, todėl reikia nustatyti pradinį elementą naudojant vėliavėlę „-frandomize-layout-seed“ arba „-frandomize-layout-seed-file“.
  • Pridėta vėliavėlė "-fstrict-flex-arrays=" “, su kuria galite valdyti lankstaus masyvo elemento ribas struktūrose (Flexible Array Members, neapibrėžto dydžio masyvas struktūros pabaigoje). Nustačius 0 (numatytasis), paskutinis struktūros elementas su masyvu visada apdorojamas kaip lankstus masyvas, 1 – tik dydžiai [], [0] ir [1] apdorojami kaip lankstus masyvas, 2 – tik dydžiai. [] ir [0] apdorojami kaip lankstus masyvas.
  • Pridėtas eksperimentinis C tipo kalbos HLSL (High-Level Shader Language) palaikymas, naudojamas DirectX rašant šešėlius.
  • Pridėta „-Warray-parameter“, kad įspėtų apie funkcijų nepaisymą su nesuderinamais argumentų deklaracijomis, susijusiomis su fiksuoto ir kintamo ilgio masyvais.
  • Patobulintas suderinamumas su MSVC. Pridėtas MSVC pateiktų „#pragma funkcijos“ (nurodo kompiliatoriui sugeneruoti funkcijos iškvietimą, o ne eilutinį išplėtimą) ir „#pragma aloc_text“ (apibrėžia skyriaus pavadinimą su funkcijos kodu) palaikymas. Pridėtas su MSVC suderinamų /JMC ir /JMC vėliavėlių palaikymas.
  • Toliau dirbama siekiant palaikyti būsimus C2X ir C++23 standartus. C kalbai yra įdiegta: atributas noreturn, raktiniai žodžiai false ir true, _BitInt(N) tipas, skirtas tam tikro bitų gylio sveikiesiems skaičiams, *_WIDTH makrokomandos, u8 priešdėlis UTF-8 koduotiems simboliams.

    C++ atveju yra įdiegta: modulių sujungimas, funkcijų narių ABI išskyrimas, užsakytas dinaminis nelokalinių kintamųjų inicijavimas moduliuose, daugiamačiai indeksų operatoriai, auto(x), nepažodiniai kintamieji, goto ir etiketės funkcijose, deklaruotose kaip constexpr. , atskirtos pabėgimo sekos, pavadinti pabėgimo simboliai.

  • Su OpenCL ir OpenMP palaikymu susijusios galimybės buvo išplėstos. Pridėtas OpenCL plėtinio cl_khr_subgroup_rotate palaikymas.
  • x86 architektūrai buvo pridėta apsauga nuo procesorių pažeidžiamumo, kurį sukelia spekuliatyvus komandų vykdymas po besąlyginių perėjimo į priekį operacijų. Problema kyla dėl prevencinio instrukcijų apdorojimo iškart po šakos instrukcijos atmintyje (SLS, Straight Line Speculation). Norint įjungti apsaugą, siūloma parinktis „-mharden-sls=[none|all|return|indirect-jmp]“.
  • Platformose, palaikančiose SSE2 plėtinį, buvo pridėtas _Float16 tipas, kuris emuliuojamas naudojant float tipą, jei nepalaikomos AVX512-FP16 instrukcijos.
  • Pridėta „-m[no-]rdpru“ vėliavėlė, skirta valdyti RDPRU instrukcijos naudojimą, palaikoma pradedant nuo AMD Zen2 procesorių.
  • Pridėta vėliavėlė „-mfunction-return=thunk-extern“, kad apsisaugotų nuo RETBLEED pažeidžiamumo, kuri veikia pridedant instrukcijų seką, kuri pašalina netiesioginių šakų spekuliacinio vykdymo mechanizmą.

Pagrindinės LLVM 15.0 naujovės:

  • Pridėtas Cortex-M85 procesoriaus, Armv9-A, Armv9.1-A ir Armv9.2-A architektūrų palaikymas, Armv8.1-M PACBTI-M plėtiniai.
  • Pridėta eksperimentinė „DirectX“ programa, kuri palaiko DXIL („DirectX Intermediate Language“) formatą, naudojamą „DirectX Shader“. Užpakalinė programa įgalinama surinkimo metu nurodant parametrą „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX“.
  • „Libc++“ toliau diegia naujas C++20 ir C++2b standartų funkcijas, įskaitant „formatų“ bibliotekos diegimo užbaigimą ir siūlomą eksperimentinę „diapazonų“ bibliotekos versiją.
  • Patobulintos x86, PowerPC ir RISC-V architektūros foninės programos.
  • Patobulintos LLD sąsajos ir LLDB derinimo priemonės galimybės.

Šaltinis: opennet.ru

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