Release fan de LLVM 15.0-kompilersuite

Nei seis moannen fan ûntwikkeling waard de frijlitting fan it LLVM 15.0-projekt presintearre - in GCC-kompatibele toolkit (kompilers, optimizers en koadegenerators) dy't programma's kompilearret yn tuskenlizzende bitcode fan RISC-like firtuele ynstruksjes (in firtuele masine op leech nivo mei in multi-level optimalisaasje systeem). De oanmakke pseudokoade kin wurde omboud mei in JIT-kompiler yn masineynstruksjes direkt op it momint fan útfiering fan it programma.

Grutte ferbetterings yn Clang 15.0:

  • Foar systemen basearre op de x86-arsjitektuer is de flagge "-fzero-call-used-regs" tafoege, dy't derfoar soarget dat alle CPU-registers dy't yn 'e funksje brûkt wurde wurde weromset nei nul foardat jo kontrôle weromkomme fan 'e funksje. Dizze opsje lit jo beskermje tsjin lekkage fan ynformaasje fan funksjes en ferminderje it oantal blokken geskikt foar it bouwen fan ROP (Return-Oriented Programming)-gadgets yn eksploaten mei sawat 20%.
  • Randomisaasje fan ûnthâld pleatsing fan struktueren foar C koade is ymplemintearre, dy't complicates de winning fan gegevens út struktueren yn it gefal fan eksploitaasje fan kwetsberens. Randomization wurdt yn- en útskeakele mei de randomize_layout en no_randomize_layout attributen, en fereasket it ynstellen fan in sied mei de flagge "-frandomize-layout-seed" of "-frandomize-layout-seed-file".
  • Added "-fstrict-flex-arrays=" flagge ", wêrmei jo de grinzen kinne kontrolearje foar in fleksibel array-elemint yn struktueren (Flexible Array Members, in array fan ûnbepaalde grutte oan 'e ein fan' e struktuer). As ynsteld op 0 (standert), wurdt it lêste elemint fan 'e struktuer mei in array altyd ferwurke as in fleksibele array, 1 - allinich grutte [], [0] en [1] wurde ferwurke as in fleksibele array, 2 - allinich grutte [] en [0] wurde ferwurke as in fleksibele array.
  • Eksperimintele stipe tafoege foar de C-like taal HLSL (High-Level Shader Language), brûkt yn DirectX foar it skriuwen fan shaders.
  • "-Warray-parameter" tafoege om te warskôgjen oer oerskriuwende funksjes mei ynkompatibele argumintdeklaraasjes ferbûn mei arrays fan fêste en fariabele lingte.
  • Ferbettere kompatibiliteit mei MSVC. Stipe tafoege foar "#pragma-funksje" (ynstruearret de gearstaller om in funksje-oprop te generearjen ynstee fan inline-útwreiding) en "#pragma alloc_text" (definiearret de namme fan 'e seksje mei de funksjekoade) levere yn MSVC. Stipe tafoege foar MSVC-kompatibele / JMC- en / JMC-flaggen.
  • Wurk bliuwt te stypjen takomstige C2X en C ++ 23 noarmen. Foar de C-taal wurde de folgjende ymplementearre: it noreturn-attribút, de kaaiwurden falsk en wier, it _BitInt(N)-type foar heule getallen fan in opjûne bitdjipte, *_WIDTH-makro's, it u8-foarheaksel foar UTF-8-kodearre tekens.

    Foar C++ wurde de folgjende ymplementearre: module gearfoeging, ABI-isolaasje fan funksjeleden, bestelde dynamyske inisjalisaasje fan net-lokale fariabelen yn modules, multidimensionale yndeksoperators, auto(x), net-letterlike fariabelen, goto en labels yn funksjes ferklearre as constexpr , skieden escape sekwinsjes, neamd escape tekens.

  • De mooglikheden ferbûn mei OpenCL en OpenMP-stipe binne útwreide. Stipe tafoege foar de OpenCL-útwreiding cl_khr_subgroup_rotate.
  • Foar de x86-arsjitektuer is beskerming tafoege tsjin kwetsberens yn processors dy't feroarsake binne troch spekulative útfiering fan ynstruksjes nei ûnbedoelde foarútspringoperaasjes. It probleem komt foar troch pre-emptive ferwurking fan ynstruksjes direkt nei de branch ynstruksje yn it ûnthâld (SLS, Straight Line Speculation). Om beskerming yn te skeakeljen, wurdt de opsje "-mharden-sls=[gjin|alles|return|indirect-jmp]" foarsteld.
  • Foar platfoarms dy't de SSE2-útwreiding stypje, is it _Float16-type tafoege, dat wurdt emulearre mei it floattype yn it gefal fan gebrek oan stipe foar AVX512-FP16-ynstruksjes.
  • Flagge "-m[no-]rdpru" tafoege om it gebrûk fan 'e RDPRU-ynstruksje te kontrolearjen, stipe te begjinnen mei AMD Zen2-processors.
  • De flagge "-mfunction-return=thunk-extern" tafoege om te beskermjen tsjin de kwetsberens fan RETBLEED, dy't wurket troch in folchoarder fan ynstruksjes ta te foegjen dy't de belutsenens fan 'e spekulative útfieringsmeganisme foar yndirekte tûken útslút.

Wichtige ynnovaasjes yn LLVM 15.0:

  • Stipe tafoege foar Cortex-M85 CPU, Armv9-A, Armv9.1-A en Armv9.2-A arsjitektuer, Armv8.1-M PACBTI-M extensions.
  • In eksperimintele backend foar DirectX is tafoege dy't it DXIL-formaat (DirectX Intermediate Language) stipet foar DirectX-shaders. De efterkant is ynskeakele troch de parameter "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" op te jaan by assemblage.
  • Libc++ giet troch mei it ymplementearjen fan nije funksjes fan 'e C++20- en C++2b-standerts, ynklusyf it foltôgjen fan 'e ymplemintaasje fan' e "format"-bibleteek en de foarstelde eksperimintele ferzje fan 'e "ranges"-biblioteek.
  • Ferbettere backends foar x86, PowerPC en RISC-V-arsjitektuer.
  • De mooglikheden fan 'e LLD-linker en de LLDB-debugger binne ferbettere.

Boarne: opennet.ru

Add a comment