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

Զարգացումից վեց ամիս հետո ներկայացվում է 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

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