Vrystelling van die LLVM 15.0-samestellersuite

Na ses maande se ontwikkeling word die vrystelling van die LLVM 15.0-projek aangebied - 'n GCC-versoenbare gereedskapstel (samestellers, optimeerders en kode-opwekkers) wat programme saamstel in 'n intermediêre bitkode van RISC-agtige virtuele instruksies ('n laevlak virtuele masjien met 'n multi-vlak optimering stelsel). Die gegenereerde pseudo-kode kan omgeskakel word deur die JIT-samesteller in masjieninstruksies op die tydstip van programuitvoering.

Groot verbeterings in Clang 15.0:

  • Vir stelsels wat op die x86-argitektuur gebaseer is, is die "-fzero-call-used-regs"-vlag bygevoeg, wat verseker dat alle SVE-registers wat in die funksie gebruik word, na nul teruggestel word voordat beheer van die funksie teruggekeer word. Hierdie opsie stel jou in staat om teen inligtinglekkasie van funksies te beskerm en die aantal blokke wat geskik is vir die bou van ROP (Return-Oriented Programming)-toestelle in misbruik met ongeveer 20% te verminder.
  • Randomisering van geheueplasing van strukture vir C-kode is geïmplementeer, wat die onttrekking van data uit strukture bemoeilik in die geval van uitbuiting van kwesbaarhede. Randomisering word aan- en afgeskakel deur gebruik te maak van die randomize_layout en no_randomize_layout eienskappe, en vereis dat 'n saad opgestel word deur die "-frandomize-layout-seed" of "-frandomize-layout-seed-file" vlag te gebruik.
  • Bygevoeg "-fstrict-flex-arrays=" vlag ", waarmee jy die grense vir 'n buigsame skikkingselement in strukture kan beheer (Flexible Array Members, 'n skikking van onbepaalde grootte aan die einde van die struktuur). Wanneer dit op 0 (verstek) gestel is, word die laaste element van die struktuur met 'n skikking altyd as 'n buigsame skikking verwerk, 1 - slegs groottes [], [0] en [1] word as 'n buigsame skikking verwerk, 2 - slegs groottes [] en [0] word soos 'n buigsame skikking verwerk.
  • Bygevoeg eksperimentele ondersteuning vir die C-agtige taal HLSL (High-Level Shader Language), gebruik in DirectX vir die skryf van shaders.
  • Bygevoeg "-Warray-parameter" om te waarsku oor oorheersende funksies met onversoenbare argumentverklarings wat met vaste- en veranderlike-lengte-skikkings geassosieer word.
  • Verbeterde verenigbaarheid met MSVC. Bygevoeg ondersteuning vir "#pragma funksie" (las die samesteller opdrag om 'n funksie oproep in plaas van inlyn uitbreiding te genereer) en "#pragma alloc_text" (definieer die naam van die afdeling met die funksie kode) verskaf in MSVC. Bygevoeg ondersteuning vir MSVC-versoenbare /JMC en /JMC vlae.
  • Werk gaan voort om toekomstige C2X- en C++23-standaarde te ondersteun. Vir die C-taal word die volgende geïmplementeer: die noreturn-kenmerk, die sleutelwoorde vals en waar, die _BitInt(N)-tipe vir heelgetalle van 'n gegewe bisdiepte, *_WIDTH-makro's, die u8-voorvoegsel vir UTF-8-gekodeerde karakters.

    Vir C++ word die volgende geïmplementeer: modulesamevoeging, ABI-isolasie van funksielede, geordende dinamiese inisialisering van nie-plaaslike veranderlikes in modules, multidimensionele indeksoperateurs, outo(x), nie-letterlike veranderlikes, goto en etikette in funksies wat as constexpr verklaar is , afgebakende ontsnappingsreekse, benoemde ontsnappingskarakters.

  • Die vermoëns wat met OpenCL- en OpenMP-ondersteuning geassosieer word, is uitgebrei. Bygevoeg ondersteuning vir die OpenCL uitbreiding cl_khr_subgroup_rotate.
  • Vir die x86-argitektuur is beskerming bygevoeg teen kwesbaarhede in verwerkers wat veroorsaak word deur spekulatiewe uitvoering van instruksies na onvoorwaardelike vorentoe spring-operasies. Die probleem kom voor as gevolg van voorkomende verwerking van instruksies onmiddellik na die takinstruksie in die geheue (SLS, Straight Line Speculation). Om beskerming te aktiveer, word die opsie "-mharden-sls=[none|all|return|indirect-jmp]" voorgestel.
  • Vir platforms wat die SSE2-uitbreiding ondersteun, is die _Float16-tipe bygevoeg, wat nageboots word deur die float-tipe te gebruik in die geval van gebrek aan ondersteuning vir AVX512-FP16-instruksies.
  • Bygevoeg "-m[no-]rdpru" vlag om die gebruik van die RDPRU instruksie te beheer, ondersteun begin met AMD Zen2 verwerkers.
  • Het die "-mfunction-return=thunk-extern" vlag bygevoeg om teen die RETBLEED kwesbaarheid te beskerm, wat werk deur 'n reeks instruksies by te voeg wat die betrokkenheid van die spekulatiewe uitvoeringsmeganisme vir indirekte takke uitsluit.

Sleutelinnovasies in LLVM 15.0:

  • Bygevoeg ondersteuning vir Cortex-M85 CPU, Armv9-A, Armv9.1-A en Armv9.2-A argitekture, Armv8.1-M PACBTI-M uitbreidings.
  • 'n Eksperimentele backend vir DirectX is bygevoeg wat die DXIL (DirectX Intermediate Language) formaat ondersteun wat vir DirectX shaders gebruik word. Die agterkant word geaktiveer deur die "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" parameter tydens samestelling te spesifiseer.
  • Libc++ gaan voort om nuwe kenmerke van die C++20- en C++2b-standaarde te implementeer, insluitend die voltooiing van die implementering van die "formaat"-biblioteek en die voorgestelde eksperimentele weergawe van die "reekse"-biblioteek.
  • Verbeterde backends vir x86-, PowerPC- en RISC-V-argitekture.
  • Die vermoëns van die LLD-skakelaar en die LLDB-ontfouter is verbeter.

Bron: opennet.ru

Voeg 'n opmerking