LLVM 15.0 компиляторлар жинағының шығарылымы

Алты айлық әзірлеуден кейін LLVM 15.0 жобасының шығарылымы ұсынылды - GCC-үйлесімді құралдар жинағы (компиляторлар, оңтайландырушылар және код генераторлары), ол бағдарламаларды RISC-тәрізді виртуалды нұсқаулардың аралық бит-кодына (төмен деңгейлі виртуалды машина) құрастырады. көп деңгейлі оңтайландыру жүйесі). Жасалған псевдокодты JIT компиляторы бағдарламаның орындалу сәтінде машиналық нұсқауларға түрлендіруі мүмкін.

Clang 15.0-дегі негізгі жақсартулар:

  • X86 архитектурасына негізделген жүйелер үшін «-fzero-call-used-regs» жалаушасы қосылды, ол функциядан басқаруды қайтармас бұрын функцияда пайдаланылатын барлық CPU регистрлерінің нөлге ысыруын қамтамасыз етеді. Бұл опция функциялардан ақпараттың ағып кетуінен қорғауға және эксплойттарда ROP (қайтаруға бағытталған бағдарламалау) гаджеттерін құруға жарамды блоктар санын шамамен 20%-ға азайтуға мүмкіндік береді.
  • С коды үшін құрылымдарды жадты орналастыруды рандомизациялау жүзеге асырылды, бұл осалдықтарды пайдалану жағдайында құрылымдардан деректерді алуды қиындатады. Рандомизация randomize_layout және no_randomize_layout атрибуттары арқылы қосылады және өшіріледі және "-frandomize-layout-seed" немесе "-frandomize-layout-seed-file" жалаушасын пайдаланып тұқым орнатуды қажет етеді.
  • "-fstrict-flex-arrays=" жалаушасы қосылды ", оның көмегімен құрылымдардағы икемді массив элементінің шекараларын басқаруға болады (Икемді массив мүшелері, құрылымның соңындағы анықталмаған өлшемді массив). 0 (әдепкі) мәніне орнатылғанда, массиві бар құрылымның соңғы элементі әрқашан икемді массив ретінде өңделеді, 1 - тек [], [0] және [1] өлшемдері икемді массив ретінде өңделеді, 2 - тек өлшемдер [] және [0] икемді массив сияқты өңделеді.
  • DirectX жүйесінде шейдерлерді жазу үшін қолданылатын C-тәрізді HLSL (Жоғары деңгейлік шейдер тілі) тіліне эксперименттік қолдау қосылды.
  • Тұрақты және айнымалы ұзындықтағы массивтермен байланысты үйлеспейтін аргументтік мәлімдемелері бар функцияларды қайта анықтау туралы ескерту үшін "-Warray-параметрі" қосылды.
  • MSVC-мен жақсартылған үйлесімділік. MSVC-де берілген "#pragma функциясы" (компиляторға кірістірілген кеңейтудің орнына функция шақыруын генерациялауға нұсқау береді) және "#pragma alloc_text" (функция коды бар бөлімнің атын анықтайды) үшін қосылған қолдау. MSVC-үйлесімді /JMC және /JMC жалауларына қолдау қосылды.
  • Болашақ C2X және C++23 стандарттарын қолдау бойынша жұмыс жалғасуда. Си тілі үшін мыналар орындалады: noreturn атрибуты, false және true кілт сөздері, берілген бит тереңдігінің бүтін сандары үшін _BitInt(N) түрі, *_WIDTH макростар, UTF-8 кодталған таңбалар үшін u8 префиксі.

    C++ үшін мыналар жүзеге асырылады: модульді біріктіру, функция мүшелерінің ABI оқшаулануы, модульдердегі жергілікті емес айнымалылардың реттелген динамикалық инициализациясы, көпөлшемді индекс операторлары, auto(x), литералды емес айнымалылар, constexpr ретінде жарияланған функциялардағы goto және белгілер , бөлінген қашу реттері, аталған шығу таңбалары.

  • OpenCL және OpenMP қолдауымен байланысты мүмкіндіктер кеңейтілді. OpenCL кеңейтімі cl_khr_subgroup_rotate үшін қосылды.
  • x86 архитектурасы үшін шартсыз алға өту әрекеттерінен кейін нұсқауларды алыпсатарлық орындау нәтижесінде туындаған процессорлардағы осалдықтардан қорғау қосылды. Мәселе жадтағы тармақталған нұсқаудан кейін бірден нұсқауларды алдын ала өңдеуге байланысты туындайды (SLS, Straight Line Speculation). Қорғауды қосу үшін “-mharden-sls=[none|all|return|indirect-jmp]” опциясы ұсынылады.
  • SSE2 кеңейтімін қолдайтын платформалар үшін AVX16-FP512 нұсқауларына қолдау болмаған жағдайда қалқымалы түрін пайдаланып эмуляцияланатын _Float16 түрі қосылды.
  • AMD Zen2 процессорларынан бастап қолдау көрсетілетін RDPRU нұсқаулығын пайдалануды басқару үшін "-m[no-]rdpru" жалаушасы қосылды.
  • Жанама тармақтар үшін алыпсатарлық орындау механизмінің қатысуын болдырмайтын нұсқаулар тізбегін қосу арқылы жұмыс істейтін RETBLEED осалдығынан қорғау үшін «-mfunction-return=thunk-extern» жалаушасы қосылды.

LLVM 15.0 негізгі инновациялары:

  • Cortex-M85 CPU, Armv9-A, Armv9.1-A және Armv9.2-A архитектуралары, Armv8.1-M PACBTI-M кеңейтімдері үшін қолдау қосылды.
  • DirectX шейдерлері үшін пайдаланылатын DXIL (DirectX Intermediate Language) пішімін қолдайтын DirectX үшін эксперименттік сервер қосылды. Бекіткіш құрастыру кезінде “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” параметрін көрсету арқылы қосылады.
  • Libc++ C++20 және C++2b стандарттарының жаңа мүмкіндіктерін енгізуді жалғастыруда, соның ішінде «пішім» кітапханасын енгізуді аяқтау және «диапазондар» кітапханасының ұсынылған эксперименттік нұсқасы.
  • x86, PowerPC және RISC-V архитектуралары үшін жақсартылған серверлер.
  • LLD байланыстырғышының және LLDB жөндеу құралының мүмкіндіктері жақсартылды.

Ақпарат көзі: opennet.ru

пікір қалдыру