LLVM 15.0 përfshin gjithashtu një numër përditësimesh interesante për C/C++.
Pas gjashtë muajsh zhvillimi, U njoftua publikimi i projektit LLVM 15.0, në të cilën janë bërë shumë ndryshime të mëdha, si dhe mbështetje të shtuar për procesorë të rinj, arkitektura dhe më shumë.
Për ata që nuk janë të njohur me LLVM, duhet ta dini se kjo është një përpilues i pajtueshëm me GCC (përpiluesit, optimizuesit dhe gjeneruesit e kodit) që përpilon programet në një bitkod të ndërmjetëm të udhëzimeve virtuale të ngjashme me RISC (një makinë virtuale e nivelit të ulët me një sistem optimizimi me shumë nivele).
Pseudokodi i gjeneruar mund të konvertohet nga përpiluesi JIT në instruksione të makinës pikërisht në momentin e ekzekutimit të programit.
Karakteristikat kryesore të reja të LLVM 15.0
Në këtë version të ri që prezantohet, theksohet se mbështetje për procesorët Cortex-M85, si dhe për arkitekturat Armv9-A, Armv9.1-A dhe Armv9.2-A, shtesat Armv8.1-M PACBTI-M.
Një ndryshim tjetër që bie në sy është se shtoi një backend eksperimental DirectX që mbështet formatin DXIL (DirectX Intermediate Language) përdoret për shaderat DirectX. Backend-i aktivizohet nëpërmjet opsionit të ndërtimit "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX".
libc++ vazhdon të implementojë veçori të reja të standardeve C++20 dhe C++2b, duke përfshirë përfundimin e zbatimit të bibliotekës "format" dhe versionin eksperimental të propozuar të bibliotekës "rangje".
Për pjesën e ndryshimeve që lidhen me Clang 15.0 përmendet se shtoi mbështetje eksperimentale për gjuhën C-si HLSL (High-Level Shading Language), e cila përdoret për të shkruar shader duke filluar me DirectX 9, si dhe për përkthimin e shaderëve HLSL në formatin binar DXIL (DirectX Intermediate Language) të pajtueshëm me DirectX 12, si dhe formatin SPIR -V të përdorur nga Vulkan. Në të ardhmen, plani për të zbatuar mbështetje për formatin DXBC (DirectX Bytecode) i përdorur në DirectX 9-11. Zbatimi ofrohet nga Microsoft dhe bazohet në DirectX Shader Compiler, i lëshuar në 2017, i ndërtuar mbi bazën e LLVM 3.7.
Gjithashtu përmendet se vazhdon me punojnë për të mbështetur standardet e ardhshme C2X dhe C++23. Zbatuar për gjuhën C: atributi noreturn, fjalët kyçe false dhe true, lloji _BitInt(N) për numrat e plotë të një thellësie të caktuar biti, makrot *_WIDTH, prefiksi u8 për karakteret UTF-8.
Përveç kësaj, është zbatuar për C++: bashkimi i moduleve, Izolimi ABI i anëtarëve të funksionit, inicializimi dinamik i urdhëruar i variablave jo lokalë në modul, operatorët e indeksit shumëdimensional, auto(x), variabla jo-literale, goto dhe etiketa në funksionet e deklaruara si constexpr, sekuenca të kufizuara escape, karaktere të emërtuara escape.
Për sistemet e bazuara në arkitekturë x86, shtoi flamurin "-fzero-call-used-regs", i cili siguron zeroizimin e të gjithë regjistrave të CPU-së të përdorur në funksion përpara kthimit të kontrollit nga funksioni. këtë opsion mbron nga rrjedhja e të dhënave të funksioneve dhe të zvogëlojë numrin e blloqeve të përshtatshme për krijimin e pajisjeve ROP (Return Oriented Programming) në shfrytëzime me rreth 20%.
Është zbatuar rastësia e vendndodhjes së kujtesës të strukturave për kodin C, gjë që vështirëson nxjerrjen e të dhënave nga strukturat në rast të shfrytëzimit të dobësive. Randomizimi aktivizohet dhe çaktivizohet me atributet randomize_layout dhe no_randomize_layout dhe kërkon që fara të vendoset me flamurin "-frandomize-layout-seed" ose "-frandomize-layout-seed-file" për të siguruar ndërtime të përsëritshme.
Nga ndryshimet e tjera që bien në sy:
- Aftësi të zgjeruara në lidhje me mbështetjen e OpenCL dhe OpenMP. Mbështetje e shtuar për zgjerimin OpenCL cl_khr_subgroup_rotate.
- Mbështetje të përmirësuara për arkitekturat x86, PowerPC dhe RISC-V.
Përmirësuar lidhjen LLD dhe aftësitë e korrigjuesit LLDB. - U shtua flamuri "-fstrict-flex-arrays=" » me të cilin mund të kontrolloni kufijtë e një elementi të grupit të butë në struktura (Soft Array Members, një grup me madhësi të pacaktuar në fund të strukturës).
- U shtua opsioni "-warray-parameter" për të paralajmëruar për funksionet mbizotëruese me deklarata të mospërputhjes së argumenteve të lidhura me vargje me gjatësi fikse dhe të ndryshueshme.
- Përputhshmëri e përmirësuar me MSVC.
- Mbështetje e shtuar për "#pragma funksionin dhe "#pragma alloc_text" të ofruara në MSVC.
- Mbështetje e shtuar për flamujt /JMC dhe /JMC të pajtueshëm me MSVC.
- U shtua flamuri "-m[no-]rdpru" për të kontrolluar përdorimin e instruksionit RDPRU, i mbështetur nga procesorët AMD Zen2.
- U shtua flamuri "-mfunction-return=thunk-extern" për të mbrojtur kundër cenueshmërisë RETBLEED, i cili funksionon duke shtuar një sekuencë udhëzimesh që përjashton pjesëmarrjen e mekanizmit të ekzekutimit spekulativ për kërcime indirekte.
Më në fund Nëse jeni të interesuar të dini më shumë për këtë, ju mund të kontrolloni detajet në lidhja vijuese.