Paglabas ng LLVM 15.0 compiler suite

Pagkatapos ng anim na buwan ng pag-unlad, ipinakita ang paglabas ng proyekto ng LLVM 15.0 - isang toolkit na katugma sa GCC (mga compiler, optimizer at code generator) na nagsasama-sama ng mga programa sa intermediate bitcode ng tulad ng RISC na virtual na mga tagubilin (isang mababang antas na virtual machine na may isang multi-level optimization system). Ang nabuong pseudocode ay maaaring ma-convert gamit ang isang JIT compiler sa mga tagubilin sa makina nang direkta sa oras ng pagpapatupad ng programa.

Mga pangunahing pagpapabuti sa Clang 15.0:

  • Para sa mga system na nakabatay sa arkitektura ng x86, ang flag na "-fzero-call-used-regs" ay idinagdag, na nagsisiguro na ang lahat ng mga rehistro ng CPU na ginamit sa function ay na-reset sa zero bago ibalik ang kontrol mula sa function. Binibigyang-daan ka ng opsyong ito na protektahan laban sa pagtagas ng impormasyon mula sa mga function at bawasan ang bilang ng mga block na angkop para sa pagbuo ng mga ROP (Return-Oriented Programming) na mga gadget sa mga pagsasamantala ng humigit-kumulang 20%.
  • Ang randomization ng memory placement ng mga istruktura para sa C code ay ipinatupad, na nagpapalubha sa pagkuha ng data mula sa mga istruktura sa kaganapan ng pagsasamantala ng mga kahinaan. Naka-on at naka-off ang randomize gamit ang randomize_layout at no_randomize_layout attributes, at nangangailangan ng pagtatakda ng seed gamit ang flag na "-frandomize-layout-seed" o "-frandomize-layout-seed-file".
  • Idinagdag ang flag na "-fstrict-flex-arrays=" ", kung saan maaari mong kontrolin ang mga hangganan para sa isang flexible array element sa mga istruktura (Flexible Array Members, isang hanay ng hindi tiyak na laki sa dulo ng istraktura). Kapag nakatakda sa 0 (default), ang huling elemento ng structure na may array ay palaging pinoproseso bilang isang flexible array, 1 - ang mga sukat lamang [], [0] at [1] ay pinoproseso bilang isang flexible array, 2 - mga laki lamang Ang [] at [0] ay pinoproseso tulad ng isang flexible array.
  • Nagdagdag ng pang-eksperimentong suporta para sa C-like na wika na HLSL (High-Level Shader Language), na ginagamit sa DirectX para sa pagsusulat ng mga shader.
  • Idinagdag ang "-Warray-parameter" upang bigyan ng babala ang tungkol sa mga overriding na function na may mga hindi tugmang deklarasyon ng argumento na nauugnay sa mga fixed- at variable-length na array.
  • Pinahusay na compatibility sa MSVC. Nagdagdag ng suporta para sa "#pragma function" (nagtuturo sa compiler na bumuo ng function call sa halip na inline expansion) at "#pragma alloc_text" (tumutukoy sa pangalan ng seksyon kasama ang function code) na ibinigay sa MSVC. Nagdagdag ng suporta para sa MSVC-compatible /JMC at /JMC flag.
  • Patuloy na sinusuportahan ng trabaho ang mga pamantayan sa hinaharap na C2X at C++23. Para sa wikang C, ang mga sumusunod ay ipinatupad: ang katangian ng noreturn, ang mga keyword na mali at totoo, ang uri ng _BitInt(N) para sa mga integer ng isang partikular na lalim ng bit, *_WIDTH macros, ang prefix ng u8 para sa mga character na naka-encode ng UTF-8.

    Para sa C++, ang mga sumusunod ay ipinapatupad: module merging, ABI isolation ng mga miyembro ng function, ordered dynamic initialization ng non-local variables sa modules, multidimensional index operators, auto(x), non-literal variables, goto at mga label sa mga function na idineklara bilang constexpr , delimited escape sequence, pinangalanang escape character.

  • Ang mga kakayahan na nauugnay sa suporta ng OpenCL at OpenMP ay pinalawak. Nagdagdag ng suporta para sa OpenCL extension na cl_khr_subgroup_rotate.
  • Para sa arkitektura ng x86, idinagdag ang proteksyon laban sa mga kahinaan sa mga processor na dulot ng speculative execution ng mga tagubilin pagkatapos ng walang kondisyong forward jump operations. Nangyayari ang problema dahil sa pre-emptive na pagproseso ng mga tagubilin kaagad kasunod ng pagtuturo ng sangay sa memorya (SLS, Straight Line Speculation). Upang paganahin ang proteksyon, ang opsyon na β€œ-mharden-sls=[none|all|return|indirect-jmp]” ay iminungkahi.
  • Para sa mga platform na sumusuporta sa extension ng SSE2, idinagdag ang uri ng _Float16, na ginagaya gamit ang uri ng float sa kaso ng kakulangan ng suporta para sa mga tagubilin ng AVX512-FP16.
  • Idinagdag ang flag na "-m[no-]rdpru" upang kontrolin ang paggamit ng pagtuturo ng RDPRU, na sinusuportahan simula sa mga processor ng AMD Zen2.
  • Idinagdag ang flag na "-mfunction-return=thunk-extern" upang maprotektahan laban sa kahinaan ng RETBLEED, na gumagana sa pamamagitan ng pagdaragdag ng pagkakasunod-sunod ng mga tagubilin na hindi kasama ang paglahok ng mekanismo ng speculative execution para sa mga hindi direktang sangay.

Mga pangunahing inobasyon sa LLVM 15.0:

  • Nagdagdag ng suporta para sa mga arkitektura ng Cortex-M85 CPU, Armv9-A, Armv9.1-A at Armv9.2-A, mga extension ng Armv8.1-M PACBTI-M.
  • Nagdagdag ng pang-eksperimentong backend para sa DirectX na sumusuporta sa format na DXIL (DirectX Intermediate Language) na ginagamit para sa mga DirectX shader. Ang backend ay pinagana sa pamamagitan ng pagtukoy sa parameter na "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" sa panahon ng pagpupulong.
  • Ang Libc++ ay patuloy na nagpapatupad ng mga bagong feature ng C++20 at C++2b na pamantayan, kabilang ang pagkumpleto ng pagpapatupad ng β€œformat” library at ang iminungkahing pang-eksperimentong bersyon ng β€œranges” library.
  • Mga pinahusay na backend para sa x86, PowerPC at RISC-V na mga arkitektura.
  • Ang mga kakayahan ng LLD linker at ang LLDB debugger ay pinahusay.

Pinagmulan: opennet.ru

Magdagdag ng komento