Զարգացումից վեց ամիս հետո ներկայացվում է LLVM 16.0 նախագծի թողարկումը՝ GCC-ի հետ համատեղելի գործիքակազմ (կոմպիլյատորներ, օպտիմիզատորներ և կոդերի գեներատորներ), որը ծրագրերը կազմում է RISC-անման վիրտուալ հրահանգների միջանկյալ բիթկոդի մեջ (ցածր մակարդակի վիրտուալ մեքենա բազմամակարդակ օպտիմալացման համակարգ): Ստեղծված կեղծ կոդը կարող է JIT կոմպիլյատորը վերածել մեքենայի հրահանգների հենց ծրագրի կատարման պահին:
Clang 16.0-ի հիմնական բարելավումները.
- Լռելյայն C++/ObjC++ ստանդարտը սահմանված է gnu++17 (նախկինում gnu++14), ինչը ենթադրում է լռելյայն աջակցություն C++17 գործառույթներին GNU ընդլայնումներով։ Նախկին վարքագծին վերադառնալու համար կարող եք օգտագործել «-std=gnu++14» տարբերակը:
- Իրականացված առաջադեմ առանձնահատկություններ՝ կապված C++20 ստանդարտի հետ.
- Պայմանականորեն չնչին հատուկ անդամի գործառույթներ,
- Լամբդա ֆունկցիաների կառուցվածքային կապերի ֆիքսում,
- Հավասարության օպերատորը արտահայտությունների ներսում,
- Որոշ համատեքստերում տիպի անուն հիմնաբառը չնշելու ունակություն,
- ագրեգատի սկզբնավորման թույլատրելիությունը փակագծերում («Aggr(val1, val2)»):
- Ապագա C++2b ստանդարտում սահմանված իրագործված առանձնահատկությունները.
- Պիտակներ թույլատրվում են բարդ արտահայտությունների վերջում,
- ստատիկ օպերատոր (),
- ստատիկ օպերատոր[],
- Տրամադրված համատեղելիություն char8_t տիպի հետ,
- «\N{...}»-ում թույլատրված նիշերի շրջանակն ընդլայնվել է,
- Ավելացրել է «static constexpr» հայտարարագրված փոփոխականներ օգտագործելու ունակությունը որպես constexpr հայտարարված ֆունկցիաներում:
- Ապագա C2x C ստանդարտում սահմանված իրագործված առանձնահատկությունները.
- «-Wunused-label» նախազգուշացումն անջատելու համար «[[ maybe_unused]]» հատկանիշը կարող է կիրառվել պիտակների վրա։
- Պիտակներ կարող են տեղադրվել բարդ արտահայտությունների ներսում ցանկացած վայրում,
- Ավելացվել են typeof և typeof_unqual օպերատորներ,
- Նոր nullptr_t տեսակ և nullptr հաստատուն՝ զրոյական ցուցիչներ սահմանելու համար, որոնք կարող են փոխարկվել ցանկացած ցուցիչի տիպի և ներկայացնում են NULL-ի տարբերակ, որը կապված չէ ամբողջ տիպերի և void*:
- C2x ռեժիմում թույլատրվում է կանչել va_start մակրո փոփոխական թվով արգումենտներով (variadic):
- C99, C11 և C17 համապատասխանության ռեժիմներում «-Wimplicit-function-declaration» և «-Wimplicit-int» տարբերակներն այժմ լռելյայն նախազգուշացման փոխարեն սխալ են առաջացնում:
- «void *» (օրինակ՝ «void func(void *p) { *p; }») անուղղակի օգտագործումը C++ ռեժիմում այժմ առաջացնում է սխալ, որը նման է ISO C++-ին, GCC-ին, ICC-ին և MSVC-ին:
- Microsoft-ի ոճի ներկառուցված հավաքման բլոկներում բիթ դաշտերը որպես հրահանգի օպերանդներ (օրինակ՝ «__asm { mov eax, s.bf }») նշելն այժմ սխալ է առաջացնում:
- Ավելացվել է ախտորոշում տարբեր մոդուլներում նույն անուններով տարբեր կառույցների և միավորումների առկայության համար:
- Ընդլայնված հնարավորություններ՝ կապված OpenCL-ի և OpenMP-ի աջակցության հետ: OpenCL միջուկի արգումենտներում օգտագործվող C++ կաղապարների բարելավված ախտորոշում: Բարելավված հերթերի բլոկի աջակցություն AMDGPU-ի համար: Nounwind հատկանիշը անուղղակիորեն ավելացվում է բոլոր գործառույթներին: Ներկառուցված գործառույթների բարելավված աջակցություն:
- Տրամադրվում է CLANG_CRASH_DIAGNOSTICS_DIR միջավայրի փոփոխականն օգտագործելու հնարավորություն՝ սահմանելու այն գրացուցակը, որտեղ պահվում են վթարի ախտորոշման տվյալները:
- Unicode-ի աջակցությունը թարմացվել է Unicode 15.0-ի ճշգրտմամբ: Որոշ մաթեմատիկական նշաններ թույլատրվում են նույնացուցիչներում, օրինակ՝ «₊» (օրինակ՝ «կրկնակի xₖ₊XNUMX»):
- Ավելացվեց մի քանի կոնֆիգուրացիայի ֆայլեր բեռնելու աջակցություն (կանխադրված կազմաձևման ֆայլերը բեռնվում են սկզբում, այնուհետև նշվածները «--config=" դրոշի միջոցով, որն այժմ կարող է մի քանի անգամ նշվել): Փոխվել է կանխադրված կազմաձևման ֆայլի բեռնման կարգը. clang-ը փորձում է նախ բեռնել ֆայլը - .cfg և չգտնվելու դեպքում փորձում է բեռնել երկու ֆայլ .cfg և .cfg. Ավելացվեց «--no-default-config» դրոշը՝ կանխադրված կարգաբերման ֆայլերի բեռնումն անջատելու համար:
- Կրկնվող կառուցումներ ապահովելու համար հնարավոր է փոխարինել ընթացիկ ամսաթվի և ժամի արժեքները __DATE__, __TIME__ և __TIMESTAMP__ մակրոներում SOURCE_DATE_EPOCH միջավայրի փոփոխականում նշված ժամանակով:
- Ստուգելու համար ներկառուցված գործառույթները (ներկառուցված), որոնք կարող են օգտագործվել հաստատունների համատեքստում, ավելացվել է «__has_constexpr_builtin» մակրո:
- Ավելացվեց նոր կոմպիլյացիոն դրոշ «-fcoro-aligned-allocation»՝ կորուտին շրջանակների հավասարեցված տեղաբաշխման համար:
- «-fstrict-flex-arrays=" դրոշն ապահովում է կառուցվածքների ճկուն զանգվածի տարրը ստուգելու երրորդ մակարդակի աջակցությունը (Flexible Array Members, կառուցվածքի վերջում անորոշ չափի զանգված): Երրորդ մակարդակում միայն «[]» չափը (օրինակ՝ «int b[]») դիտվում է որպես ճկուն զանգված, իսկ «[0]» չափը (օրինակ՝ «int b[0]») չէ.
- Ավելացվեց «-fmodule-output» դրոշը՝ ստանդարտ C++ մոդուլների համար միաֆազ կոմպիլյացիայի մոդելը միացնելու համար:
- Ավելացվեց «-Rpass-analysis=stack-frame-layout» ռեժիմը, որը թույլ է տալիս ախտորոշել stack frame-ի դասավորության հետ կապված խնդիրները:
- Ավելացվել է նոր հատկանիշ __attribute__((target_version("cpu_features"))) և __attribute__((target_clones("cpu_features1","cpu_features2",…))) հատկանիշի ֆունկցիոնալությունը ընդլայնվել է տրամադրված առանձնահատկությունների որոշակի տարբերակներ ընտրելու համար: CPU AArch64-ի կողմից:
- Ընդլայնված ախտորոշիչ գործիքներ.
- Ավելացվեց «-Wsingle-bit-bitfield-constant-conversion» նախազգուշացումը՝ հայտնաբերելու անուղղակի կրճատումը մեկ բիթով ստորագրված բիթ դաշտին վերագրելիս:
- Չնախնականացված constexpr փոփոխականների ընդլայնված ախտորոշում:
- Ավելացվել են «-Wcast-function-type-strict» և «-Wincompatible-function-pointer-types-strict» նախազգուշացումները՝ ֆունկցիայի տեսակի հեռարձակման հետ կապված հնարավոր խնդիրները հայտնաբերելու համար:
- Ավելացվեց ախտորոշում արտահանման բլոկներում սխալ կամ վերապահված մոդուլների անունների օգտագործման համար:
- Սահմանումների մեջ բացակայող «ավտո» հիմնաբառերի բարելավված հայտնաբերում:
- «-Winteger-overflow» նախազգուշացման իրականացմանը ավելացվել են լրացուցիչ արտահոսքի իրավիճակների ստուգումներ:
- Իրականացված աջակցություն LoongArch հրահանգների հավաքածուի ճարտարապետությանը (-march=loongarch64 կամ -march=la464), որն օգտագործվում է Loongson 3 5000 պրոցեսորներում, որն իրականացնում է նոր RISC ISA, որը նման է MIPS-ին և RISC-V-ին:
Հիմնական նորամուծությունները LLVM 16.0-ում.
- LLVM կոդում թույլատրվում է C++17 ստանդարտով սահմանված տարրերի օգտագործումը։
- LLVM կառուցելու համար շրջակա միջավայրի պահանջների ավելացում: Կառուցման գործիքակազմն այժմ պետք է աջակցի C++17 ստանդարտին, այսինքն. կառուցման համար պահանջվում է առնվազն GCC 7.1, Clang 5.0, Apple Clang 10.0 կամ Visual Studio 2019 16.7:
- Cortex-A64, Cortex-X715 և Neoverse V3 պրոցեսորների, RME MEC (Memory Encryption Contexts) assembler, Armv2 ընդլայնումների (Complex Number) և Function Multi Versioning-ի աջակցությունն ավելացվել է AArch8.3 հետին պլանում:
- ARM ճարտարապետական բեքենդն այլևս չի աջակցում Armv2, Armv2A, Armv3 և Armv3M թիրախային հարթակներին, որոնց համար կոդերի ճիշտ ստեղծումը երաշխավորված չէր: Ավելացվել է կոմպլեքս թվերի հետ աշխատելու հրահանգների համար կոդ ստեղծելու հնարավորություն:
- Ավելացվել է աջակցում հրահանգների հավաքածուների ճարտարապետություններին (ISA) AMX-FP86, CMPCXADD, AVX-IFMA, AVX-VNNI-INT16, AVX-NE-CONVERT X8 հետնամասին: Ավելացված է աջակցություն RDMSRLIST, RMSRLIST և WRMSRNS հրահանգներին: Իրականացվել է «-mcpu=raptorlake», «-mcpu=meteorlake», «-mcpu=emeraldrapids», «-mcpu=sierraforest», «-mcpu=graniterapids» և «-mcpu=grandridge» տարբերակները:
- Ավելացվեց պաշտոնական աջակցություն LoongArch հարթակի համար:
- MIPS, PowerPC և RISC-V ճարտարապետությունների բարելավված backends
- LLDB կարգաբերիչին ավելացվել է LoongArch ճարտարապետության համար 64-բիթանոց գործադիրների վրիպազերծման աջակցությունը: COFF վրիպազերծման նշանների բարելավված կառավարում: Տրամադրվել է կրկնօրինակ DLL-ների զտում բեռնված Windows մոդուլների ցանկում:
- Libc++ գրադարանում հիմնական աշխատանքը կենտրոնացած էր C++20 և C++23 ստանդարտների նոր հնարավորությունների համար աջակցության իրականացման վրա:
- Միացման ժամանակը զգալիորեն կրճատվել է LDD կապակցիչում՝ զուգահեռացնելով հասցեների տեղափոխման սկանավորումը և հատվածի սկզբնավորման գործողությունները: Ավելացվեց հատվածի սեղմման աջակցություն՝ օգտագործելով ZSTD ալգորիթմը:
Source: opennet.ru