LLVM 15.0 կոմպիլյատորների փաթեթի թողարկում

Զարգացումից վեց ամիս հետո ներկայացվում է LLVM 15.0 նախագծի թողարկումը՝ GCC-ի հետ համատեղելի գործիքակազմ (կոմպիլյատորներ, օպտիմիզատորներ և կոդերի գեներատորներ), որը ծրագրերը կազմում է RISC-անման վիրտուալ հրահանգների միջանկյալ բիթկոդի մեջ (ցածր մակարդակի վիրտուալ մեքենա բազմամակարդակ օպտիմալացման համակարգ): Ստեղծված կեղծ կոդը կարող է JIT կոմպիլյատորը վերածել մեքենայի հրահանգների հենց ծրագրի կատարման պահին:

Clang 15.0-ի հիմնական բարելավումները.

  • x86 ճարտարապետության վրա հիմնված համակարգերի համար ավելացվել է «-fzero-call-used-regs» դրոշը, որն ապահովում է, որ գործառույթում օգտագործվող բոլոր պրոցեսորի ռեգիստրները զրոյականացվեն նախքան գործառույթից կառավարումը վերադարձնելը: Այս տարբերակը թույլ է տալիս պաշտպանվել գործառույթներից տեղեկատվության արտահոսքից և կրճատել ROP (Return-Oriented Programming) գաջեթներ ստեղծելու համար հարմար բլոկների քանակը մոտավորապես 20%-ով:
  • Իրականացվել է C կոդի համար կառուցվածքների հիշողության տեղադրման պատահականացում, ինչը բարդացնում է կառուցվածքներից տվյալների արդյունահանումը խոցելիության օգտագործման դեպքում: Randomization-ը միացված և անջատված է օգտագործելով randomize_layout և no_randomize_layout ատրիբուտները, և պահանջում է սերմ սահմանել՝ օգտագործելով «-frandomize-layout-seed» կամ «-frandomize-layout-seed-file» դրոշը:
  • Ավելացվեց «-fstrict-flex-arrays=» դրոշը, որով կարող եք կառավարել կառուցվածքների ճկուն զանգվածի տարրի սահմանները (Flexible Array Members, անորոշ չափի զանգված կառուցվածքի վերջում): Երբ սահմանվում է 0 (կանխադրված), զանգվածով կառուցվածքի վերջին տարրը միշտ մշակվում է որպես ճկուն զանգված, 1 - միայն [], [0] և [1] չափերը մշակվում են որպես ճկուն զանգված, 2-ը՝ միայն չափերը։ [] և [0]-ը մշակվում են ճկուն զանգվածի նման:
  • Ավելացվեց փորձնական աջակցություն C-ի նման HLSL (High-Level Shader Language) համար, որն օգտագործվում է DirectX-ում՝ ստվերներ գրելու համար:
  • Ավելացվեց «-Warray-parameter»՝ նախազգուշացնելու ֆիքսված և փոփոխական երկարությամբ զանգվածների հետ կապված անհամատեղելի փաստարկների հայտարարագրերով գերակայող գործառույթների մասին:
  • Բարելավված համատեղելիություն MSVC-ի հետ: Ավելացվել է աջակցություն «#pragma ֆունկցիայի» համար (կոմպիլյատորին հանձնարարում է ստեղծել ֆունկցիայի կանչ՝ ներկառուցված ընդլայնման փոխարեն) և «#pragma alloc_text» (սահմանում է բաժնի անվանումը ֆունկցիայի կոդով) տրամադրված MSVC-ում։ Ավելացված է աջակցություն MSVC-համատեղելի /JMC և /JMC դրոշների համար:
  • Աշխատանքները շարունակվում են ապագա C2X և C++23 ստանդարտներին աջակցելու համար: C լեզվի համար իրականացվում են հետևյալը. noreturn հատկանիշը, false և true հիմնաբառերը, _BitInt(N) տեսակը տվյալ բիթային խորության ամբողջ թվերի համար, *_WIDTH մակրոները, UTF-8 կոդավորված նիշերի u8 նախածանցը:

    C++-ի համար իրականացվում են հետևյալը՝ մոդուլների միաձուլում, ֆունկցիայի անդամների ABI-ի մեկուսացում, մոդուլներում ոչ տեղական փոփոխականների պատվիրված դինամիկ սկզբնավորում, բազմաչափ ինդեքսային օպերատորներ, auto(x), ոչ բառացի փոփոխականներ, goto և պիտակներ՝ որպես constexpr հայտարարված ֆունկցիաներում: , սահմանազատեց փախուստի հաջորդականությունը, անվանեց փախուստի նիշերը։

  • Ընդլայնվել են OpenCL և OpenMP աջակցության հետ կապված հնարավորությունները: Ավելացվեց աջակցություն OpenCL cl_khr_subgroup_rotate ընդլայնման համար:
  • x86 ճարտարապետության համար ավելացվել է պաշտպանություն պրոցեսորների խոցելիություններից, որոնք առաջացել են հրահանգների սպեկուլյատիվ կատարման հետևանքով անվերապահ թռիչքային գործողություններից հետո: Խնդիրն առաջանում է հիշողության մեջ ճյուղի հրահանգին անմիջապես հաջորդող հրահանգների կանխարգելիչ մշակման պատճառով (SLS, Straight Line Speculation): Պաշտպանությունը միացնելու համար առաջարկվում է «-mharden-sls=[none|all|return|indirect-jmp]» տարբերակը:
  • SSE2 ընդլայնումն աջակցող հարթակների համար ավելացվել է _Float16 տեսակը, որը նմանակվում է float տեսակի միջոցով՝ AVX512-FP16 հրահանգների աջակցության բացակայության դեպքում:
  • Ավելացվեց «-m[no-]rdpru» դրոշը՝ RDPRU հրահանգի օգտագործումը վերահսկելու համար, որն աջակցվում է՝ սկսած AMD Zen2 պրոցեսորներից:
  • Ավելացվել է «-mfunction-return=thunk-extern» դրոշը՝ RETBLEED խոցելիությունից պաշտպանվելու համար, որն աշխատում է հրահանգների հաջորդականության ավելացմամբ, որը բացառում է անուղղակի ճյուղերի սպեկուլյատիվ կատարման մեխանիզմի ներգրավումը:

Հիմնական նորամուծությունները LLVM 15.0-ում.

  • Ավելացված է աջակցություն Cortex-M85 CPU, Armv9-A, Armv9.1-A և Armv9.2-A ճարտարապետությունների, Armv8.1-M PACBTI-M ընդլայնումների համար:
  • DirectX-ի համար ավելացվել է փորձնական հետին պլան, որն աջակցում է DirectX ստվերների համար օգտագործվող DXIL (DirectX միջանկյալ լեզու) ձևաչափին: Backend-ը միացված է՝ հավաքման ընթացքում նշելով «-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX» պարամետրը:
  • Libc++-ը շարունակում է C++20 և C++2b ստանդարտների նոր հնարավորությունների ներդրումը, ներառյալ «ֆորմատ» գրադարանի ներդրման ավարտը և «տիրույթների» գրադարանի առաջարկվող փորձնական տարբերակը:
  • Բարելավված backends x86, PowerPC և RISC-V ճարտարապետությունների համար:
  • LLD կապող և LLDB կարգաբերիչի հնարավորությունները բարելավվել են:

Source: opennet.ru

Добавить комментарий