Զարգացման վեց ամիս հետո ներկայացված նախագծի թողարկում LLVM 11.0 - GCC-ի հետ համատեղելի գործիքներ (կոմպիլյատորներ, օպտիմիզատորներ և կոդերի գեներատորներ), որոնք ծրագրերը կազմում են RISC-անման վիրտուալ հրահանգների միջանկյալ բիթկոդի մեջ (ցածր մակարդակի վիրտուալ մեքենա՝ բազմամակարդակ օպտիմալացման համակարգով): Ստեղծված կեղծ կոդը կարող է JIT կոմպիլյատորը վերածել մեքենայի հրահանգների հենց ծրագրի կատարման պահին:
Նոր թողարկման հիմնական փոփոխությունը ներառում էր Ֆլանկ, ֆրոնտենդ Fortran լեզվի համար։ Flang-ն աջակցում է Fortran 2018-ին, OpenMP 4.5-ին և OpenACC 3.0-ին, սակայն նախագծի մշակումը դեռ ավարտված չէ, և ճակատային մասը սահմանափակվում է ծածկագրի վերլուծությամբ և դրա ճշգրտության ստուգմամբ: LLVM միջանկյալ կոդի ստեղծումը դեռ չի աջակցվում, և գործարկվող ֆայլեր ստեղծելու համար ստեղծվում է կանոնական կոդը և փոխանցվում արտաքին Fortran կոմպիլյատորին:
Ավելացվեց վերացական շարահյուսական ծառը վերականգնելու հնարավորությունը (ՀՍՏ) սխալ 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»-ի փոխարեն:
«-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) բարելավել է կատարումը և ավելացրել նոր ախտորոշիչ հնարավորություններ:
Կառուցման համակարգը փոխվել է 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 ինտերֆեյսի միջոցով: