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

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

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

  • C++20 ստանդարտում առաջարկված «հավանական» և «հավանական» ատրիբուտների աջակցությունը ներդրվել և միացվել է լռելյայն, ինչը թույլ է տալիս օպտիմիզատորին տեղեկացված լինել պայմանական կառուցվածքի գործարկման հավանականության մասին (օրինակ՝ «[[հավանաբար ]] եթե (պատահական > 0) {“):
  • Ավելացվել է AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) և Intel Sapphire Rapids (-march=sapphirerapids) պրոցեսորների աջակցություն:
  • Ավելացվել է «-march=x86-64-v[234]» դրոշների աջակցություն՝ x86-64 ճարտարապետության մակարդակները ընտրելու համար (v2 - ընդգրկում է SSE4.2, SSSE3, POPCNT և CMPXCHG16B ընդարձակումները; v3 - AVX2 և MOVBE; v4 - AVX-512 ) .
  • Ավելացված է աջակցություն Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) և Fujitsu A64FX (a64fx) պրոցեսորներին: Օրինակ, Neoverse-V1 պրոցեսորների համար օպտիմալացումները միացնելու համար կարող եք նշել «-mcpu=neoverse-v1»:
  • AArch64 ճարտարապետության համար ավելացվել են «-moutline-atomics» և «-mno-outline-atomics» կոմպիլյատորների նոր դրոշները՝ միացնելու կամ անջատելու ատոմային շահագործման օգնական գործառույթները, ինչպիսիք են «__aarch64_cas8_relax»: Նման գործառույթները գործարկման ժամանակ հայտնաբերում են, թե արդյոք LSE (Large System Extensions) աջակցությունը հասանելի է, և օգտագործում են տրված ատոմային պրոցեսորի հրահանգները կամ վերադառնում են համաժամացման համար LL/SC (Load-link/store-conditional) հրահանգներին:
  • Ավելացվեց «-fbinutils-version» տարբերակը՝ ընտրելու binutils փաթեթի թիրախային տարբերակը՝ ավելի հին կապող և մոնտաժային վարքագծի հետ համատեղելիության համար:
  • ELF գործարկվող ֆայլերի համար, երբ «-gz» դրոշը նշված է, ապա վրիպազերծման տեղեկատվության սեղմումը zlib գրադարանի միջոցով միացված է լռելյայն (gz=zlib): Ստացված օբյեկտների ֆայլերը կապելու համար պահանջվում է lld կամ GNU binutils 2.26+: Binutils-ի հին տարբերակների հետ համատեղելիությունը վերականգնելու համար կարող եք նշել «-gz=zlib-gnu»:
  • «Այս» ցուցիչը այժմ մշակվում է ոչ զրոյական և չհղվող (N) ստուգումներով: Nonnull հատկանիշը հեռացնելու համար, եթե Ձեզ անհրաժեշտ է օգտագործել NULL արժեքներ, կարող եք օգտագործել «-fdelete-null-pointer-checks» տարբերակը։
  • Linux պլատֆորմում «-fasynchronous-unwind-tables» ռեժիմը միացված է AArch64 և PowerPC ճարտարապետությունների համար, որպեսզի ստեղծեն անսարք զանգերի աղյուսակներ, ինչպես GCC-ում:
  • «#pragma clang loop vectorize_width»-ում ավելացվել է «ֆիքսված» (կանխադրված) և «scalable» տարբերակները՝ վեկտորացման մեթոդը ընտրելու համար: «Ընդլայնվող» ռեժիմը, անկախ վեկտորի երկարությունից, փորձնական է և կարող է օգտագործվել ապարատային սարքավորումների վրա, որոնք աջակցում են ընդլայնելի վեկտորացմանը:
  • Windows պլատֆորմի բարելավված աջակցություն. Arm64 համակարգերում պատրաստվել են Windows-ի պաշտոնական երկուական հավաքներ, ներառյալ Clang կոմպիլյատորը, LLD կապիչը և կոմպիլյատոր-rt գործարկման գրադարանները: MinGW թիրախային հարթակների համար կառուցելիս .exe վերջածանցն ավելացվում է նույնիսկ խաչաձև կոմպիլյացիայի ժամանակ:
  • Ընդլայնվել են OpenCL-ի, OpenMP-ի և CUDA-ի աջակցության հետ կապված հնարավորությունները: Ավելացվել են «-cl-std=CL3.0» և «-cl-std=CL1.0» տարբերակները՝ OpenCL 3.0-ի և OpenCL 1.0-ի համար մակրո տարբերակներ ընտրելու համար: Ընդլայնվել են ախտորոշիչ գործիքները։
  • Ավելացվել է աջակցություն HRESET, UINTR և AVXVNNI հրահանգներին, որոնք իրականացվել են x86-ի վրա հիմնված որոշ պրոցեսորներում:
  • x86 համակարգերում «-mtune=» տարբերակի աջակցությունը միացված է, ինչը հնարավորություն է տալիս ընտրված միկրոճարտարապետական ​​օպտիմալացումներին՝ անկախ «-march=» արժեքից:
  • Ստատիկ անալիզատորը բարելավել է որոշ POSIX գործառույթների մշակումը և զգալիորեն բարելավել է պայմանական գործողությունների արդյունքի որոշումը, երբ համեմատության մեջ կան մի քանի խորհրդանշական արժեքներ: Ավելացվել են նոր ստուգումներ՝ fuchia.HandleChecker (սահմանում է բռնակներ կառուցվածքներում), webkit.UncountedLambdaCapturesChecker webkit և alpha.webkit.UncountedLocalVarsChecker (հաշվի է առնում ցուցիչների հետ աշխատելու առանձնահատկությունները WebKit շարժիչի կոդի մեջ):
  • Հաստատությունների համատեքստում օգտագործվող արտահայտություններում ներկառուցված գործառույթների օգտագործումը __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_bitreverse, __bit_scan_reverse, _bsd_scan_reverse, _bsd_scan_reverse, _bsd _ թույլատրվում է bswapq , _castf*, __rol* և __ror*։
  • Ավելացրել է «BitFieldColonSpacing» տարբերակ «clang-format» ծրագրին՝ նույնացուցիչների, սյունակների և դաշտերի սահմանումների շուրջ տարածությունն ընտրելու համար:
  • Linux պլատֆորմի վրա clangd caching սերվերը (Clang Server) զգալիորեն կրճատել է հիշողության սպառումը երկարաժամկետ շահագործման ընթացքում (պարբերական զանգերը malloc_trim-ին տրամադրվում են անվճար հիշողության էջերը օպերացիոն համակարգ վերադարձնելու համար):

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

  • Python-ով գրված llvm-build build գործիքի աջակցությունը դադարեցվել է, և փոխարենը նախագիծն ամբողջությամբ անցել է CMake build համակարգի օգտագործմանը։
  • AArch64 ճարտարապետության հետին պլանում բարելավվել է Windows պլատֆորմի աջակցությունը. ապահովվել է նպատակային Windows համակարգերի համար հավաքող ելքի ճիշտ արտադրություն, օպտիմիզացված է անսարք զանգերի տվյալների ստեղծումը (նման տվյալների չափը կրճատվել է 60-ով: %), անսամբլերի միջոցով unwind տվյալների ստեղծման հնարավորությունը ավելացվել է դիրեկտիվներով .seh_*:
  • PowerPC ճարտարապետության հետին պլանը ներառում է օղակների և ներկառուցված տեղակայման նոր օպտիմալացումներ, Power10 պրոցեսորների ընդլայնված աջակցություն, մատրիցային մանիպուլյացիայի MMA հրահանգների ավելացված աջակցություն և AIX օպերացիոն համակարգի բարելավված աջակցություն:
  • x86 backend-ն ավելացնում է AMD Zen 3, Intel Alder Lake և Intel Sapphire Rapids պրոցեսորների աջակցությունը, ինչպես նաև HRESET, UINTR և AVXVNNI պրոցեսորների հրահանգները: Աջակցություն MPX-ին (Memory Protection Extensions)՝ ցուցիչները ստուգելու համար՝ ապահովելու համար, որ հիշողության սահմաններն այլևս չեն աջակցվում (այս տեխնոլոգիան տարածված չէ և արդեն հեռացվել է GCC-ից և զրնգում): Ավելացվել է աջակցություն assembler-ին {disp32} և {disp8} նախածանցների և .d32 և .d8 վերջածանցների համար՝ օպերանդների շեղումների և թռիչքների չափը վերահսկելու համար: Ավելացրել է նոր հատկանիշ «tune-cpu»՝ միկրոճարտարապետական ​​օպտիմալացումների ընդգրկումը վերահսկելու համար:
  • Նոր «-fsanitize=unsigned-shift-base» ռեժիմն ավելացվել է ամբողջ թվերի խնդրի դետեկտորին (ամբողջ թվերի ախտահանիչ, «-fsanitize=integer»)՝ անստորագիր ամբողջ թվերի արտահոսքը հայտնաբերելու համար՝ մի փոքր ձախ շեղվելուց հետո:
  • Տարբեր դետեկտորներում (asan, cfi, lsan, msan, tsan, ubsan sanitizer) ավելացվել է ստանդարտ Musl գրադարանով Linux բաշխումների աջակցություն:
  • Ընդլայնվել են LLD կապիչի հնարավորությունները: ELF ձևաչափի բարելավված աջակցություն, ներառյալ ավելացված տարբերակները «--dependency-file», «-error-handling-script», «-lto-pseudo-probe-for-profiling», «-no-lto-whole-program»: - տեսանելիություն» Բարելավված MinGW աջակցություն: Mach-O ձևաչափի համար (macOS) իրականացվել է arm64, arm և i386 ճարտարապետությունների, կապի ժամանակի օպտիմալացումների (LTO) և բացառությունների մշակման համար stack unwinding աջակցություն:
  • Libc++-ը ներդրում է C++20 ստանդարտի նոր առանձնահատկությունները և սկսել է մշակել C++2b բնութագրերի առանձնահատկությունները: Ավելացվել է աջակցություն՝ անջատելու տեղայնացման աջակցությամբ (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) և կեղծ պատահական թվեր ստեղծող սարքերի համար (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”):

Source: opennet.ru

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