Liberigo de la kompililo LLVM 15.0

Post ses monatoj da evoluo, la publikigo de la projekto LLVM 15.0 estis prezentita - GCC-kongrua ilaro (kompiloj, optimumigiloj kaj kodgeneratoroj) kiu kompilas programojn en mezan peckodon de RISC-similaj virtualaj instrukcioj (malaltnivela virtuala maŝino kun plurnivela optimumiga sistemo). La generita pseŭdokodo povas esti konvertita uzante JIT-kompililon en maŝininstrukciojn rekte dum programekzekuto.

Gravaj plibonigoj en Clang 15.0:

  • Por sistemoj bazitaj sur la x86-arkitekturo, la flago "-fzero-call-used-regs" estis aldonita, kiu certigas, ke ĉiuj CPU-registroj uzataj en la funkcio estas rekomencigitaj al nulo antaŭ resendi kontrolon de la funkcio. Ĉi tiu opcio permesas protekti vin kontraŭ informa elfluado de funkcioj kaj redukti la nombron da blokoj taŭgaj por konstrui ROP (Return-Oriented Programming) aparatoj en ekspluatoj je proksimume 20%.
  • Hazardigo de memorlokigo de strukturoj por C-kodo estis efektivigita, kio malfaciligas la eltiron de datumoj de strukturoj en la okazaĵo de ekspluato de vundeblecoj. Hazardigo estas ŝaltita kaj malŝaltita uzante la atributojn randomize_layout kaj no_randomize_layout, kaj postulas agordi semon uzante la flagon "-frandomize-layout-seed" aŭ "-frandomize-layout-seed-file".
  • Aldonita flago "-fstrict-flex-arrays=" ", per kiu vi povas kontroli la limojn por fleksebla tabelelemento en strukturoj (Flexible Array Members, tabelo de nedifinita grandeco ĉe la fino de la strukturo). Kiam agordita al 0 (defaŭlte), la lasta elemento de la strukturo kun tabelo ĉiam estas prilaborita kiel fleksebla tabelo, 1 - nur grandecoj [], [0] kaj [1] estas prilaboritaj kiel fleksebla tabelo, 2 - nur grandecoj [] kaj [0] estas prilaboritaj kiel fleksebla tabelo.
  • Aldonita eksperimenta subteno por la C-simila lingvo HLSL (High-Level Shader Language), uzita en DirectX por skribi ombrilojn.
  • Aldonita "-Warray-parameter" por averti pri superregado de funkcioj kun nekongruaj argumentdeklaroj asociitaj kun fiksaj kaj variablo-longaj tabeloj.
  • Plibonigita kongruo kun MSVC. Aldonita subteno por "#pragma funkcio" (instruas la kompililon generi funkciovokon anstataŭ enlinia vastiĝo) kaj "#pragma alloc_text" (difinas la nomon de la sekcio kun la funkciokodo) provizita en MSVC. Aldonita subteno por MSVC-kongruaj /JMC kaj /JMC-flagoj.
  • Laboro daŭre subtenas estontajn C2X kaj C++23-normojn. Por la C-lingvo, la jenaj estas efektivigitaj: la noreturn-atributo, la ŝlosilvortoj malvera kaj vera, la _BitInt(N) tipo por entjeroj de antaŭfiksita bitprofundo, *_WIDTH-makrooj, la u8-prefikso por UTF-8 koditaj signoj.

    Por C++, la sekvantaroj estas efektivigitaj: modulfuzio, ABI-izolado de funkciomembroj, ordigita dinamika inicialigo de ne-lokaj variabloj en moduloj, plurdimensiaj indeksfunkciigistoj, aŭto(x), ne-laŭvortaj variabloj, goto kaj etikedoj en funkcioj deklaritaj kiel constexpr , limigitaj eskaposekvencoj, nomitaj eskaposignoj.

  • La kapabloj asociitaj kun OpenCL kaj OpenMP-subteno estis vastigitaj. Aldonita subteno por la OpenCL etendo cl_khr_subgroup_rotate.
  • Por la arkitekturo x86, protekto estis aldonita kontraŭ vundeblecoj en procesoroj kaŭzitaj de konjekta plenumo de instrukcioj post senkondiĉaj antaŭensaltaj operacioj. La problemo okazas pro preventa prilaborado de instrukcioj tuj sekvante la branĉinstrukcion en memoro (SLS, Straight Line Speculation). Por ebligi protekton, la opcio “-mharden-sls=[neniu|ĉio|reveno|indirect-jmp]” estas proponita.
  • Por platformoj kiuj subtenas la etendon SSE2, la _Float16-tipo estis aldonita, kiu estas kopiita uzante la flosilon en la kazo de manko de subteno por AVX512-FP16-instrukcioj.
  • Aldonita "-m[no-]rdpru" flago por kontroli la uzon de la RDPRU-instrukcio, subtenata komencante per AMD Zen2-procesoroj.
  • Aldonita la flago "-mfunction-return=thunk-extern" por protekti kontraŭ la vundebleco de RETBLEED, kiu funkcias aldonante sekvencon de instrukcioj, kiuj ekskludas la implikiĝon de la konjekta ekzekutmekanismo por nerektaj branĉoj.

Ŝlosilaj novigoj en LLVM 15.0:

  • Aldonita subteno por Cortex-M85 CPU, Armv9-A, Armv9.1-A kaj Armv9.2-A arkitekturoj, Armv8.1-M PACBTI-M etendaĵoj.
  • Eksperimenta backend por DirectX estis aldonita, kiu subtenas la DXIL (DirectX Intermediate Language) formaton uzatan por DirectX-ombriloj. La backend estas ebligita specifante la parametron "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" dum asembleo.
  • Libc++ daŭre efektivigas novajn funkciojn de la C++20 kaj C++2b-normoj, inkluzive de la kompletigo de la efektivigo de la "formata" biblioteko kaj la proponita eksperimenta versio de la "intervaloj" biblioteko.
  • Plibonigitaj backends por arkitekturoj x86, PowerPC kaj RISC-V.
  • La kapabloj de la LLD-ligilo kaj la LLDB-sencimigilo estis plifortigitaj.

fonto: opennet.ru

Aldoni komenton