Dumating ang LLVM 15.0 na may mga pagpapahusay para sa iba't ibang mga backend, higit na suporta at higit pa

Ang LLVM 15 ay nagpapatupad ng mga pagpapabuti sa suporta

Kasama rin sa LLVM 15.0 ang ilang mga kawili-wiling update sa C/C++.

Pagkatapos ng anim na buwan ng pag-unlad, Inihayag ang paglabas ng proyekto ng LLVM 15.0, kung saan maraming malalaking pagbabago ang nagawa, pati na rin ang karagdagang suporta para sa mga bagong processor, arkitektura, at higit pa.

Para sa mga hindi pamilyar sa LLVM, dapat mong malaman na ito ay isang compiler na katugma sa GCC (mga compiler, optimizer, at code generator) na nag-compile ng mga programa sa isang tulad ng RISC na virtual na pagtuturo na intermediate bitcode (isang mababang antas na virtual machine na may multilevel optimization system).

Ang nabuong pseudocode ay maaaring i-convert ng JIT compiler sa mga tagubilin sa makina sa oras lamang ng pagpapatupad ng programa.

Pangunahing mga bagong tampok ng LLVM 15.0

Sa bagong bersyon na ito na ipinakita, ito ay naka-highlight na ang suporta para sa mga processor ng Cortex-M85, pati na rin para sa Armv9-A, Armv9.1-A at Armv9.2-A na mga arkitektura, Armv8.1-M PACBTI-M extension.

Ang isa pang pagbabago na namumukod-tangi ay iyon nagdagdag ng pang-eksperimentong DirectX backend ito sumusuporta sa DXIL format (DirectX Intermediate Language) na ginagamit para sa DirectX shaders. Ang backend ay pinagana sa pamamagitan ng "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" build option.

Ang libc++ ay patuloy na nagpapatupad ng mga bagong feature ng mga pamantayan ng C++20 at C++2b, kabilang ang pagkumpleto ng "format" na pagpapatupad ng library at ang iminungkahing pang-eksperimentong bersyon ng "range" library.

Para sa bahagi ng mga pagbabago na may kaugnayan sa Clang 15.0 nabanggit na nagdagdag ng pang-eksperimentong suporta para sa C-like na wikang HLSL (High-Level Shading Language), na ginagamit para sa pagsusulat ng mga shader na nagsisimula sa DirectX 9, pati na rin ang pagsasalin ng mga HLSL shader sa DirectX 12-compatible na DXIL (DirectX Intermediate Language) na binary na format, pati na rin ang SPIR format -V na ginagamit ng Vulkan. Sa hinaharap, planong ipatupad ang suporta para sa format na DXBC (DirectX Bytecode) na ginagamit sa DirectX 9-11. Ang pagpapatupad ay ibinigay ng Microsoft at batay sa DirectX Shader Compiler, na inilabas noong 2017, na binuo batay sa LLVM 3.7.

Nabanggit din na nagpapatuloy ito sa magtrabaho upang suportahan ang mga pamantayan sa hinaharap na C2X at C++23. Ipinatupad para sa wikang C: ang noreturn attribute, ang false at true na mga keyword, ang _BitInt(N) na uri para sa mga integer ng isang partikular na bit depth, ang *_WIDTH macros, ang u8 prefix para sa UTF-8 na mga character.

Bukod diyan, ay ipinatupad para sa C++: module merging, ABI paghihiwalay ng mga miyembro ng function, iniutos ang dynamic na pagsisimula ng mga hindi lokal na variable sa module, multidimensional index operator, auto(x), mga di-literal na variable, goto at mga label sa mga function na idineklara bilang constexpr, delimited escape sequence, pinangalanang escape character.

Para sa mga sistema batay sa arkitektura x86, idinagdag ang flag na "-fzero-call-used-regs", na nagbibigay ng zeroing ng lahat ng mga rehistro ng CPU na ginamit sa function bago ibalik ang kontrol mula sa function. pagpipiliang ito pinoprotektahan laban sa pagtagas ng data ng mga function at bawasan ang bilang ng mga bloke na angkop para sa paglikha ng mga ROP (Return Oriented Programming) na mga device sa mga pagsasamantala ng humigit-kumulang 20%.

Naipatupad ang randomization ng lokasyon ng memorya ng mga istruktura para sa C code, na nagpapalubha sa pagkuha ng data mula sa mga istruktura sa kaso ng pagsasamantala ng mga kahinaan. Ang randomize ay naka-on at naka-off gamit ang randomize_layout at no_randomize_layout na mga katangian, at nangangailangan ng seed na itakda na may flag na "-frandomize-layout-seed" o "-frandomize-layout-seed-file" upang matiyak na mauulit ang mga build.

Sa iba pang mga pagbabago matindi yan:

  • Mga pinalawak na kakayahan na nauugnay sa suporta ng OpenCL at OpenMP. Nagdagdag ng suporta para sa OpenCL extension na cl_khr_subgroup_rotate.
  • Mga pinahusay na backend para sa x86, PowerPC, at RISC-V na mga arkitektura.
    Pinahusay na LLD linker at LLDB debugger na kakayahan.
  • Idinagdag ang flag na "-fstrict-flex-arrays=" » kung saan makokontrol mo ang mga limitasyon ng isang soft array element sa mga istruktura (Soft Array Members, isang array ng hindi tiyak na laki sa dulo ng structure).
  • Idinagdag ang opsyong "-warray-parameter" upang magbigay ng babala tungkol sa mga overriding na function na may mga hindi tugmang deklarasyon ng argumento na nauugnay sa mga nakapirming at variable na haba ng array.
  • Pinahusay na pagiging tugma sa MSVC.
  • Nagdagdag ng suporta para sa "#pragma function at "#pragma alloc_text" na ibinigay sa MSVC.
  • Nagdagdag ng suporta para sa MSVC-compatible /JMC at /JMC flag.
  • Idinagdag ang flag na "-m[no-]rdpru" upang kontrolin ang paggamit ng pagtuturo ng RDPRU, na sinusuportahan mula 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 isang sequence ng mga tagubilin na hindi kasama ang partisipasyon ng mekanismo ng speculative execution para sa mga hindi direktang pagtalon.

Sa wakas Kung interesado kang malaman ang tungkol dito, maaari mong suriin ang mga detalye sa sumusunod na link.


Idagdag bilang ginustong mapagkukunan sa Google