LLVM 15.0 indeholder også en række interessante opdateringer til C/C++.
Efter seks måneders udvikling, LLVM 15.0-projektudgivelse annonceret, i hvilken der er foretaget en masse store ændringer, samt tilføjet understøttelse af nye processorer, arkitekturer og mere.
For dem, der ikke er bekendt med LLVM, bør du vide, at dette er en GCC-kompatibel compiler (kompilatorer, optimeringsprogrammer og kodegeneratorer), der kompilerer programmer til en RISC-lignende virtuel instruktionsmellembitkode (en virtuel maskine på lavt niveau med et optimeringssystem på flere niveauer).
Den genererede pseudokode kan konverteres af JIT-kompileren til maskininstruktioner lige på tidspunktet for programudførelse.
Vigtigste nye funktioner i LLVM 15.0
I denne nye version, der præsenteres, fremhæves det, at understøttelse af Cortex-M85-processorer, samt for Armv9-A, Armv9.1-A og Armv9.2-A arkitekturer, Armv8.1-M PACBTI-M udvidelser.
En anden ændring, der skiller sig ud, er den tilføjet en eksperimentel DirectX-backend at understøtter DXIL-format (DirectX Intermediate Language) bruges til DirectX shaders. Backend er aktiveret via "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" build-indstillingen.
libc++ fortsætter med at implementere nye funktioner af C++20- og C++2b-standarderne, herunder færdiggørelsen af ​​"format"-biblioteksimplementeringen og den foreslåede eksperimentelle version af "ranges"-biblioteket.
For den del af ændringerne, der vedrører Clang 15.0, nævnes det, at tilføjet eksperimentel støtte til C-lignende sprog HLSL (High-Level Shading Language), som bruges til at skrive shaders startende med DirectX 9, samt oversætte HLSL shaders til DirectX 12-kompatibelt DXIL (DirectX Intermediate Language) binært format, samt SPIR format -V brugt af Vulkan. I fremtiden, planlægger at implementere understøttelse af DXBC-formatet (DirectX Bytecode) brugt i DirectX 9-11. Implementeringen er leveret af Microsoft og er baseret på DirectX Shader Compiler, udgivet i 2017, bygget på basis af LLVM 3.7.
Det nævnes også, at det fortsætter med arbejde for at understøtte fremtidige C2X- og C++23-standarder. Implementeret for C-sproget: noreturn-attributten, falske og sande nøgleord, _BitInt(N)-typen for heltal af en given bitdybde, *_WIDTH-makroerne, u8-præfikset for UTF-8-tegn.
Ud over det er blevet implementeret til C++: modulfusion, ABI-isolering af funktionsmedlemmer, bestilt dynamisk initialisering af ikke-lokale variabler i modul, multidimensionelle indeksoperatorer, auto(x), ikke-bogstavelige variable, goto og etiketter i funktioner erklæret som constexpr, afgrænsede escape-sekvenser, navngivne escape-tegn.
Til systemer baseret på arkitekturen x86, tilføjet "-fzero-call-used-regs" flag, som giver nulstilling af alle CPU-registre, der bruges i funktionen, før kontrollen returneres fra funktionen. denne mulighed beskytter mod datalækage af funktioner og reducere antallet af blokke, der er egnede til at skabe ROP (Return Oriented Programming) enheder i exploits med omkring 20%.
Randomisering af hukommelsesplacering er blevet implementeret af strukturerne for C-kode, hvilket komplicerer udtræk af data fra strukturerne i tilfælde af udnyttelse af sårbarheder. Randomisering slås til og fra med attributterne randomize_layout og no_randomize_layout og kræver, at seedet sættes med flaget "-frandomize-layout-seed" eller "-frandomize-layout-seed-file" for at sikre gentagelige builds.
Af de andre ændringer der skiller sig ud:
- Udvidede muligheder relateret til OpenCL og OpenMP support. Tilføjet understøttelse af OpenCL-udvidelsen cl_khr_subgroup_rotate.
- Forbedrede backends til x86-, PowerPC- og RISC-V-arkitekturer.
Forbedrede LLD-linker- og LLDB-debugger-funktioner. - Tilføjet "-fstrict-flex-arrays=" flag », hvormed du kan kontrollere grænserne for et blødt array-element i strukturer (Soft Array Members, et array af ubestemt størrelse i slutningen af ​​strukturen).
- Tilføjet "-warray-parameter" mulighed for at advare om tilsidesættelse af funktioner med uoverensstemmende argumenterklæringer forbundet med arrays med fast og variabel længde.
- Forbedret kompatibilitet med MSVC.
- Tilføjet understøttelse af "#pragma-funktionen og "#pragma alloc_text" i MSVC.
- Tilføjet understøttelse af MSVC-kompatible /JMC- og /JMC-flag.
- Tilføjet "-m[no-]rdpru" flag for at kontrollere brugen af ​​RDPRU-instruktionen, understøttet af AMD Zen2-processorer.
- Tilføjet flaget "-mfunction-return=thunk-extern" for at beskytte mod RETBLEED-sårbarheden, som virker ved at tilføje en sekvens af instruktioner, der udelukker deltagelse af den spekulative eksekveringsmekanisme for indirekte hop.
Endelig Hvis du er interesseret i at vide mere om det, du kan kontrollere detaljerne i følgende link.