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

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

LLVM 9.0-ի նոր առանձնահատկությունները ներառում են փորձնական նախագծման պիտակի հեռացում թիրախային RISC-V հարթակից, C++ աջակցություն OpenCL-ին, ծրագիրը LLD-ում դինամիկ բեռնված մասերի բաժանելու հնարավորությունը և «asm goto«, որն օգտագործվում է Linux միջուկի կոդում։ libc++-ն ավելացրեց աջակցություն WASI-ին (WebAssembly System Interface), իսկ LLD-ն ավելացրեց նախնական աջակցություն WebAssembly դինամիկ կապակցման համար:

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

  • Ավելացված է GCC-ին հատուկ արտահայտության իրականացում «asm goto«, որը թույլ է տալիս տեղափոխել assembler inline բլոկից C կոդով պիտակ: Այս հատկությունը պահանջվում է Linux միջուկը «CONFIG_JUMP_LABEL=y» ռեժիմում ստեղծելու համար՝ օգտագործելով Clang x86_64 ճարտարապետությամբ համակարգերի վրա: Հաշվի առնելով նախորդ թողարկումներում ավելացված փոփոխությունները՝ Linux միջուկն այժմ կարող է կառուցվել Clang-ով x86_64 ճարտարապետության համար (նախկինում աջակցվում էր միայն arm, aarch64, ppc32, ppc64le և mips ճարտարապետությունները): Ավելին, Android և ChromeOS նախագծերն արդեն փոխակերպվել են Clang-ի միջուկ կառուցելու համար, և Google-ը փորձարկում է Clang-ը՝ որպես իր արտադրական Linux համակարգերի միջուկներ կառուցելու հիմնական հարթակ: Ապագայում միջուկի կառուցման գործընթացում կարող են օգտագործվել այլ LLVM բաղադրիչներ, ներառյալ LLD, llvm-objcopy, llvm-ar, llvm-nm և llvm-objdump;
  • Ավելացվեց փորձնական աջակցություն OpenCL-ում C++17-ի օգտագործման համար: Հատուկ առանձնահատկությունները ներառում են հասցեների տարածության ատրիբուտների աջակցություն, հասցեների տարածության փոխակերպման արգելափակում ըստ տիպի ձուլման օպերատորների, վեկտորի տեսակների տրամադրում, ինչպես OpenCL-ում C-ում, պատկերների, իրադարձությունների, ալիքների հատուկ OpenCL տիպերի առկայությունը և այլն:
  • Կազմողի նոր դրոշակները ավելացվել են «-ftime-trace» և «-ftime-trace-granularity=N»՝ ճակատային մասի տարբեր փուլերի կատարման ժամանակի վերաբերյալ հաշվետվություն ստեղծելու համար (վերլուծություն, սկզբնավորում) և հետին պլան (օպտիմալացման փուլեր): Զեկույցը պահվում է json ձևաչափով, որը համատեղելի է chrome://tracing-ի և speedscope.app-ի հետ;
  • Ավելացվել է «__declspec(հատկացուցիչ)» ցուցիչի մշակում և ուղեկցող վրիպազերծման տեղեկատվության ստեղծում, որը թույլ է տալիս վերահսկել հիշողության սպառումը Visual Studio միջավայրում;
  • C լեզվի համար աջակցություն է ավելացվել «__FILE_NAME__» մակրոյի համար, որը նման է «__FILE__» մակրոյին, բայց ներառում է միայն ֆայլի անունը՝ առանց ամբողջական ուղու.
  • C++-ն ընդլայնել է հասցեների տարածքի ատրիբուտների աջակցությունը՝ ծածկելու տարբեր C++ հատկանիշներ, ներառյալ պարամետրերի և փաստարկների օրինաչափությունները, հղումների տեսակները, վերադարձի տիպի եզրակացությունը, օբյեկտները, ավտոմատ ստեղծվող գործառույթները, ներկառուցված օպերատորները և այլն:
  • Ընդլայնվել են OpenCL-ի, OpenMP-ի և CUDA-ի աջակցության հետ կապված հնարավորությունները: Սա ներառում է ներկառուցված OpenCL գործառույթների անուղղակի ընդգրկման նախնական աջակցություն (ավելացվել է «-fdeclare-opencl-builtins» դրոշը), ներդրվել է cl_arm_integer_dot_product ընդլայնումը և ընդլայնվել են ախտորոշիչ գործիքները.
  • Բարելավվել է ստատիկ անալիզատորի աշխատանքը և ավելացվել է ստատիկ վերլուծություն կատարելու փաստաթղթերը: Ավելացվել են դրոշներ՝ հասանելի ստուգիչ մոդուլները և աջակցվող ընտրանքները ցուցադրելու համար (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” և “-analyzer-checker[-option]-help «-մշակող»): Ավելացվեց «-analyzer-werror» դրոշը՝ զգուշացումները որպես սխալներ վերաբերելու համար:
    Ավելացվել է նոր ստուգման ռեժիմներ.

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling՝ բուֆերների հետ աշխատելու համար ոչ անվտանգ պրակտիկաները հայտնաբերելու համար;
    • osx.MIGChecker՝ MIG (Mach Interface Generator) զանգի կանոնների խախտումներ որոնելու համար;
    • optin.osx.OSObjectCStyleCast՝ XNU libkern օբյեկտների սխալ փոխարկումները գտնելու համար;
    • apiModeling.llvm մոդելավորման ստուգման գործառույթների մի շարք՝ LLVM կոդերի բազայում սխալները հայտնաբերելու համար;
    • Կայունացված կոդ՝ չնախնականացված C++ օբյեկտները ստուգելու համար (UninitializedObject optin.cplusplus փաթեթում);
  • Clang-format ծրագիրը ավելացրել է C# լեզվով կոդի ձևաչափման աջակցություն և ապահովում է Microsoft-ի կողմից օգտագործվող կոդի ձևաչափման ոճը:
  • clang-cl-ը՝ հրամանի տողի այլընտրանքային ինտերֆեյսը, որն ապահովում է տարբերակների մակարդակի համատեղելիություն Visual Studio-ում ներառված cl.exe կոմպիլյատորի հետ, ավելացրել է էվրիստիկա՝ գոյություն չունեցող ֆայլերը որպես հրամանի տող ընտրանքներ դիտարկելու և համապատասխան նախազգուշացում ցուցադրելու համար (օրինակ՝ երբ աշխատում է «clang-cl /diagnostic :caret /c test.cc»);
  • Նոր ստուգումների մեծ մասը ավելացվել է linter clang-tidy-ին, ներառյալ ավելացված ստուգումներ, որոնք հատուկ են OpenMP API-ին:
  • Ընդլայնված սերվերի հնարավորությունները սեղմեց (Clang Server), որում լռելյայն միացված է ֆոնային ինդեքսի կառուցման ռեժիմը, ավելացվել է կոդով համատեքստային գործողությունների աջակցություն (փոփոխական որոնում, ավտոմատ և մակրո սահմանումների ընդլայնում, փախած տողերի փոխակերպում չփախվածների), ցուցադրելու հնարավորություն։ նախազգուշացումներ Clang-tidy-ից, վերնագրի ֆայլերում սխալների ընդլայնված ախտորոշում և ավելացրել է տիպի հիերարխիայի մասին տեղեկատվություն ցուցադրելու հնարավորությունը.

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

  • LLD կապողին ավելացվել է փորձնական բաժանման հատկություն, որը թույլ է տալիս մեկ ծրագիրը բաժանել մի քանի մասերի, որոնցից յուրաքանչյուրը գտնվում է առանձին ELF ֆայլում։ Այս հատկությունը թույլ է տալիս գործարկել ծրագրի հիմնական մասը, որը շահագործման ընթացքում անհրաժեշտության դեպքում բեռնելու է այլ բաղադրիչներ (օրինակ, ներկառուցված PDF դիտիչը կարող եք առանձնացնել առանձին ֆայլի մեջ, որը կբեռնվի միայն այն ժամանակ, երբ օգտագործողը բացի PDF-ը։ ֆայլ):

    LLD կապող առաջին պլան բերեց մի վիճակ, որը հարմար է Linux միջուկը միացնելու համար arm32_7, arm64, ppc64le և x86_64 ճարտարապետությունների համար:
    Նոր ընտրանքներ «-» (ելք դեպի stdout), «-[no-]allow-shlib-undefined», «-undefined-glob», «-nmagic», «-omagic», «-dependent-library», « - z ifunc-noplt» և «-z common-page-size»: AArch64 ճարտարապետության համար ավելացվել է աջակցություն BTI (Branch Target Indicator) և PAC (Pointer Authentication Code) հրահանգներին: Զգալիորեն բարելավվել է MIPS, RISC-V և PowerPC հարթակների աջակցությունը: Ավելացվեց նախնական աջակցություն WebAssembly-ի դինամիկ կապի համար;

  • libc++-ում իրականացվել է ssize, std::is_constant_evaluated, std::midpoint և std::lerp ֆունկցիաները, std::span-ին ավելացվել են «front» և «back» մեթոդները, std::is_unbounded_array և std::is_bounded_array տեսակների ատրիբուտները: , std հնարավորությունները ընդլայնվել են՝ :atomic. GCC 4.9-ի աջակցությունը դադարեցվել է (կարելի է օգտագործել GCC 5.1 և ավելի նոր թողարկումների հետ): Ավելացված աջակցություն ՎԱՍԻ (WebAssembly System Interface, զննարկիչից դուրս WebAssembly-ի օգտագործման ինտերֆեյս);
  • Ավելացվել են նոր օպտիմալացումներ։ Որոշ իրավիճակներում միացված է memcmp զանգերի փոխակերպումը bcmp: Իրականացված բացթողում միջակայքի ստուգման համար թռիչքային աղյուսակների համար, որոնցում ստորին անջատիչ բլոկները անհասանելի են կամ երբ հրահանգները չեն օգտագործվում, օրինակ՝ void տիպով ֆունկցիաներ կանչելիս.
  • RISC-V ճարտարապետության backend-ը կայունացվել է, որն այլևս տեղադրված չէ որպես փորձնական և կառուցված է լռելյայն: Ապահովում է կոդերի ստեղծման ամբողջական աջակցություն RV32I և RV64I հրահանգների հավաքածուի տարբերակների՝ MAFDC ընդլայնումներով;
  • Բազմաթիվ բարելավումներ են կատարվել X86, AArch64, ARM, SystemZ, MIPS, AMDGPU և PowerPC ճարտարապետությունների backend-ներում: Օրինակ՝ ճարտարապետության համար
    AArch64-ն ավելացրեց աջակցություն SVE2 (Scalable Vector Extension 2) և MTE (Memory Tagging Extensions) հրահանգներին, ARM backend-ում ավելացվեց աջակցություն Armv8.1-M ճարտարապետությանը և MVE (M-Profile Vector Extension) ընդլայնմանը: GFX10 (Navi) ճարտարապետության աջակցությունն ավելացվել է AMDGPU հետին պլանին, գործառույթի կանչման հնարավորությունները լռելյայն միացված են, և համակցված անցագիրն ակտիվացված է: DPP (Տվյալներ-Զուգահեռ պրիմիտիվներ):

  • LLDB վրիպազերծիչն այժմ ունի գունային ընդգծում հետքայլերի համար և ավելացված աջակցություն DWARF4 debug_types և DWARF5 debug_info բլոկներին;
  • COFF ձևաչափով օբյեկտների և գործարկվող ֆայլերի աջակցությունն ավելացվել է llvm-objcopy և llvm-strip կոմունալ ծառայություններին:

Source: opennet.ru

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