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

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

Նոր թողարկման հիմնական փոփոխությունը ներառում էր Ֆլանկ, ֆրոնտենդ Fortran լեզվի համար։ Flang-ն աջակցում է Fortran 2018-ին, OpenMP 4.5-ին և OpenACC 3.0-ին, սակայն նախագծի մշակումը դեռ ավարտված չէ, և ճակատային մասը սահմանափակվում է ծածկագրի վերլուծությամբ և դրա ճշգրտության ստուգմամբ: LLVM միջանկյալ կոդի ստեղծումը դեռ չի աջակցվում, և գործարկվող ֆայլեր ստեղծելու համար ստեղծվում է կանոնական կոդը և փոխանցվում արտաքին Fortran կոմպիլյատորին:

Բարելավումներ Clang 11.0-ում.

  • Ավելացվեց վերացական շարահյուսական ծառը վերականգնելու հնարավորությունը (ՀՍՏ) սխալ C++ կոդի համար, որը կարող է օգտագործվել սխալների ախտորոշման համար և լրացուցիչ տեղեկատվություն է տրամադրում արտաքին կոմունալ ծառայությունների համար, ինչպիսիք են clang-tidy և clangd: Հատկանիշը լռելյայն միացված է C++ կոդի համար և կառավարվում է «-Xclang -f[no-]recovery-ast» ընտրանքների միջոցով:
  • Ավելացվել է նոր ախտորոշման ռեժիմներ.
    • «-Wpointer-to-int-cast»-ը նախազգուշացումների խումբ է ամբողջ թվով int տեսակի վրա ցուցիչներ փոխանցելու վերաբերյալ, որը չի պարունակում բոլոր հնարավոր արժեքները:
    • «-Wuninitialized-const-reference» - նախազգուշացում ֆունկցիայի պարամետրերում չնախաստորված փոփոխականներ փոխանցելու մասին, որոնք ընդունում են «const» հատկանիշով հղումային արգումենտներ:
    • «-Wimplicit-const-int-float-conversion»-ը նախազգուշացում է իրական հաստատունը լռելյայնորեն միացված ամբողջ թվի անուղղակի փոխակերպման մասին:
  • ARM պլատֆորմի համար տրամադրվում են կոմպիլյատորում ներկառուցված C ֆունկցիաներ (Ինտրինսիկա) փոխարինվում է արդյունավետ Arm v8.1-M MVE և CDE վեկտորի հրահանգներով: Հասանելի գործառույթները սահմանված են arm_mve.h և arm_cde.h վերնագրի ֆայլերում։
  • Ավելացված է Ընդլայնված ամբողջ տիպերի մի շարք _ExtInt(N), որը թույլ է տալիս ստեղծել տիպեր, որոնք երկուսի հզորության բազմապատիկ չեն, որոնք կարող են արդյունավետ կերպով մշակվել FPGA/HLS-ում: Օրինակ, _ExtInt(7)-ը սահմանում է 7 բիթից բաղկացած ամբողջ թվի տեսակ։
  • Ավելացվել են մակրոներ, որոնք սահմանում են ներկառուցված C ֆունկցիաների աջակցությունը՝ հիմնված ARM SVE (Scalable Vector Extension) հրահանգների վրա.
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4: Օրինակ, __ARM_FEATURE_SVE մակրոսը սահմանվում է AArch64 կոդը ստեղծելիս «-march=armv8-a+sve» հրամանի տողի տարբերակով:

  • «-O» դրոշակն այժմ նույնացվում է «-O1» օպտիմալացման ռեժիմի հետ՝ «-O2»-ի փոխարեն:
  • Ավելացվել է նոր կոմպիլյատորի դրոշներ.
    • «-fstack-clash-protection» - հնարավորություն է տալիս պաշտպանվել դեմ կույտային և կույտային խաչմերուկներ.
    • «-ffp-exception-behavior={ignore,maytrap,strict}»- թույլ է տալիս ընտրել բացառությունների մշակման ռեժիմը լողացող կետով թվերի համար:
    • «-ffp-model={precise,strict,fast}»-ը պարզեցնում է լողացող կետով թվերի մի շարք մասնագիտացված տարբերակների հասանելիությունը:
    • «-fpch-codegen» և «-fpch-debuginfo»՝ նախապես կազմված վերնագիր (PCH) ստեղծելու համար՝ առանձին օբյեկտային ֆայլերով կոդի և վրիպազերծման համար:
    • «-fsanitize-coverage-allowlist» և «-fsanitize-coverage-blocklist»՝ սպիտակ ցուցակի և սև ցուցակի ծածկույթի փորձարկումը ստուգելու համար:
    • «-mtls-size={12,24,32,48}»՝ TLS (շղթա-տեղական պահեստ) չափն ընտրելու համար:
    • «-menable-experimental-extension»՝ փորձնական RISC-V ընդլայնումները միացնելու համար:
  • Լռելյայնորեն, C-ն օգտագործում է «-fno-common» ռեժիմը, որը թույլ է տալիս ավելի արդյունավետ մուտք գործել գլոբալ փոփոխականներ որոշ հարթակներում:
  • Լռելյայն մոդուլի քեշը /tmp-ից տեղափոխվեց ~/.cache գրացուցակ: Անտեսելու համար կարող եք օգտագործել «-fmodules-cache-path=" դրոշը:
  • Լռելյայն C ստանդարտը թարմացվել է gnu11-ից gnu17:
  • Ավելացվեց նախնական աջակցություն GNU C ընդլայնման համար »asm գիծ» assembler ներդիրներ ավելացնելու համար: Ընդլայնումը միայն վերլուծված է առայժմ, բայց ոչ մի կերպ չի մշակվում:
  • Ընդլայնված հնարավորություններ՝ կապված OpenCL-ի և CUDA-ի աջակցության հետ: Ավելացվել է OpenCL 2.0 բլոկների ախտորոշման աջակցություն և OpenMP 5.0-ի նոր հնարավորություններ:
  • Ավելացվեց IndentExternBlock տարբերակ՝ clang-format օգտակար գործիքին՝ արտաքին «C» և արտաքին «C++» բլոկների ներսում դասավորելու համար:
  • C++-ում ժառանգված կոնստրուկտորների բարելավված կառավարումը ստատիկ անալիզատորում: Ավելացվեցին նոր ստուգումներ alpha.core.C11Lock և alpha.fuchsia.Lock՝ կողպեքների առկայությունը ստուգելու համար, alpha.security.cert.pos.34c՝ putenv, webkit.NoUncountedMemberChecker և webkit.NoUncountedMemberChecker և webkit.RefCntblBaseVirtualDtor-ի ոչ անվտանգ օգտագործումը հայտնաբերելու համար, անհաշվելի տեսակները հայտնաբերելու համար: .cplusplus .SmartPtr՝ խելացի ցուցիչի զրոյական մատնանշումը ստուգելու համար:
  • Լինտերի մեջ՝ կոկիկ ավելացրել է նոր չեկերի մեծ մասը.
  • Սերվերի քեշավորումը clangd (Clang Server) բարելավել է կատարումը և ավելացրել նոր ախտորոշիչ հնարավորություններ:

Հիմնական նորամուծություններ LLVM 11.0:

  • Կառուցման համակարգը փոխվել է Python 3-ի օգտագործման:
  • Go լեզվի (llgo) կոմպիլյատորով ճակատը բացառված է թողարկումից, որը կարող է հետագայում վերակառուցվել:
  • Vector-function-abi-variant հատկանիշը ավելացվել է միջանկյալ ներկայացմանը (IR)՝ նկարագրելու համար սկալյար և վեկտորային ֆունկցիաների միջև քարտեզագրումը կանչի վեկտորացման համար: Երկու առանձին վեկտոր llvm::FixedVectorType և llvm::ScalableVectorType առանձնացված են llvm::VectorType-ից:
  • Այն համարվում է չսահմանված վարքագիծ ճյուղավորելու համար՝ հիմնված udef արժեքների վրա և փոխանցել undef արժեքները ստանդարտ գրադարանային գործառույթներին: IN
    memset/memcpy/memmove undef ցուցիչների փոխանցումը թույլատրվում է, բայց եթե չափի պարամետրը զրո է։

  • LLJIT-ն ավելացրել է աջակցություն LLJIT::initialize և LLJIT::deinitialize մեթոդների միջոցով ստատիկ սկզբնավորումներ կատարելու համար: Իրականացրել է JITDylib-ին ստատիկ գրադարաններ ավելացնելու հնարավորությունը՝ օգտագործելով StaticLibraryDefinitionGenerator դասը: Ավելացվեց C API-ի համար ORCv2 (API JIT կոմպիլյատորներ կառուցելու համար):
  • Ավելացվել է Cortex-A64, Cortex-A34, Cortex-A77 և Cortex-X78 պրոցեսորների աջակցությունը AArch1 ճարտարապետության հետին մասում: Իրականացված ARMv8.2-BF16 (BFloat16) և ARMv8.6-A ընդլայնումներ, ներառյալ RMv8.6-ECV (Ընդլայնված հաշվիչի վիրտուալացում), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors վիրտուալացում) և ARMv8.0-DGH (Տվյալների հավաքագրման հուշում): Ապահովված է SVE վեկտորի հրահանգների համար ներկառուցված փաթաթման գործառույթների համար կոդ ստեղծելու հնարավորություն:
  • Cortex-M55, Cortex-A77, Cortex-A78 և Cortex-X1 պրոցեսորների աջակցությունը ավելացվել է ARM ճարտարապետության հետին պլանում: Իրականացված ընդարձակումներ
    Armv8.6-A Matrix Multiply և RMv8.2-AA32BF16 BFloat16:

  • PowerPC ճարտարապետության հետնամասում ավելացվել է POWER10 պրոցեսորների համար կոդերի ստեղծման աջակցություն: Ընդլայնված հանգույցի օպտիմալացում և լողացող կետով գործողությունների բարելավված աջակցություն:
  • RISC-V ճարտարապետության հետին պլանին թույլատրվում է ընդունել պատչեր՝ աջակցությամբ փորձարարական ընդլայնված հրահանգների հավաքածուներին, որոնք դեռ պաշտոնապես չեն հաստատվել:
  • AVR ճարտարապետության backend-ը փորձարարական կատեգորիայից տեղափոխվել է կայուն՝ ներառված բազային փաթեթում:
  • x86 ճարտարապետության հետնամասն աջակցում է Intel AMX և TSXLDTRK հրահանգներին: Ավելացվեց հարձակման պաշտպանություն LVI (Load Value Injection), ինչպես նաև ընդհանուր Speculative Execution Side Effect Suppression մեխանիզմն իրականացվում է CPU-ում գործողությունների սպեկուլյատիվ կատարման հետևանքով առաջացած հարձակումները արգելափակելու համար:
  • Ավելացվեց MemorySanitizer-ի և LeakSanitizer-ի աջակցությունը SystemZ-ի հետին մասում:
  • Libc++-ին ավելացվել է մաթեմատիկական հաստատուններով վերնագրի ֆայլի աջակցություն .
  • Ընդլայնված LLD կապող հնարավորություններ: Բարելավված ELF ձևաչափի աջակցություն, ներառյալ ավելացնելով «--lto-emit-asm», «--lto-whole-program-visibility», «--print-archive-stats», «--shuffle-sections», «-- thinlto- մեկ մոդուլ», «--եզակի», «--rosegment», «--threads=N»: Ավելացվեց «--time-trace» տարբերակը՝ հետքը ֆայլում պահելու համար, որն այնուհետև կարող է վերլուծվել Chrome-ում chrome://tracing ինտերֆեյսի միջոցով:

Source: opennet.ru

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