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

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

LLVM 10.0-ի նոր հնարավորությունները ներառում են C++ Concepts-ի աջակցությունը, Clang-ն այլևս չի աշխատում որպես առանձին գործընթաց, Windows-ի համար CFG (վերահսկող հոսքի պահակ) ստուգումների աջակցություն և պրոցեսորի նոր հնարավորությունների աջակցություն:

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

  • Ավելացվել է աջակցություն «հայեցակարգը«, C++ կաղապարի ընդլայնում, որը կներառվի հաջորդ ստանդարտում՝ C++2a ծածկագրով (միացված է -std=c++2a դրոշով):
    Հասկացությունները թույլ են տալիս սահմանել կաղապարի պարամետրերի պահանջների մի շարք, որոնք կոմպիլյացիայի ժամանակ սահմանափակում են արգումենտների շարքը, որոնք կարող են ընդունվել որպես կաղապարի պարամետրեր: Հասկացությունները կարող են օգտագործվել կաղապարում օգտագործվող տվյալների տեսակների հատկությունների և մուտքային պարամետրերի տվյալների տիպի հատկությունների միջև տրամաբանական անհամապատասխանություններից խուսափելու համար:

    կաղապար
    հասկացություն EqualityComparable = պահանջում է (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Լռելյայնորեն, առանձին գործընթացի գործարկումը («clang -cc1»), որում կատարվում է կոմպիլյացիան, դադարեցվում է: Կազմումն այժմ կատարվում է հիմնական գործընթացում, և «-fno-integrated-cc1» տարբերակը կարող է օգտագործվել հին վարքագիծը վերականգնելու համար:
  • Նոր ախտորոշման ռեժիմներ.
    • «-Wc99-designator»-ը և «-Wreorder-init-list»-ը նախազգուշացնում են C++ ռեժիմում C99-ի սկզբնավորիչների օգտագործման դեմ այն ​​դեպքերում, երբ դրանք ճիշտ են C99-ում, բայց ոչ C++20-ում:
    • «-Wsizeof-array-div» - բռնում է այնպիսի իրավիճակներ, ինչպիսիք են «int arr[10]; …sizeof(arr) / sizeof(short)…” (պետք է լինի “sizeof(arr) / sizeof(int)”):
    • «-Wxor-used-as-po» - նախազգուշացնում է այնպիսի կառուցվածքների օգտագործման դեմ, ինչպիսին է «^» (xor) օպերատորի օգտագործումը այն գործողություններում, որոնք կարող են շփոթվել հզորության հետ (2^16):
    • «-Wfinal-dtor-non-final-class» - նախազգուշացնում է դասերի մասին, որոնք նշված չեն «վերջնական» ցուցիչով, բայց ունեն «վերջնական» հատկանիշով դեստրուկտոր:
    • «-Wtautological-bitwise-compare»-ը նախազգուշացումների խումբ է՝ բիթային գործողության և հաստատունի միջև տավտոլոգիական համեմատությունները ախտորոշելու և միշտ ճշմարիտ համեմատությունները բացահայտելու համար, որոնցում բիթային OR գործողությունը կիրառվում է ոչ բացասական թվի վրա:
    • «-Wbitwise-conditional-parantheses»-ը զգուշացնում է AND (&) և OR (|) տրամաբանական օպերատորները պայմանական օպերատորի հետ խառնելիս խնդիրների մասին (?:):
    • «-Wmisleading-indentation»-ը GCC-ի համանուն չեկի անալոգն է, որը նախազգուշացնում է մատնանշված արտահայտությունների մասին, կարծես դրանք if/else/for/while բլոկի մաս են, բայց իրականում դրանք ներառված չեն այս բլոկում: .
    • «-Wextra» նշելիս «-Wdeprecated-copy» ստուգումը միացված է՝ նախազգուշացնելով կոնստրուկտորների օգտագործման մասին։
      «տեղափոխել» և «պատճենել» դասերում՝ բացահայտ դեստրուկտորի սահմանմամբ:

    • Ընդլայնվել են «-Wtautological-overlap-compare», «-Wsizeof-pointer-div», «-Wtautological-compare», «-Wrange-loop-analysis» ստուգումները:
    • «-Wbitwise-op-parentheses» և «-Wlogical-op-parentheses» ստուգումները լռելյայն անջատված են:
  • C և C++ կոդերում ցուցիչի թվաբանական գործողությունները թույլատրվում են միայն զանգվածներում։ Undefined Behavior Sanitizer-ը «-fsanitize=pointer-overflow» ռեժիմում այժմ բռնում է այնպիսի դեպքեր, ինչպիսիք են զրոյական ցուցիչին ոչ զրոյական շեղում ավելացնելը կամ չզրոյական ցուցիչից ամբողջ թիվ հանելիս զրոյական ցուցիչ ստեղծելը:
  • «-fsanitize=implicit-conversion» (Implicit Conversion Sanitizer) ռեժիմը հարմարեցված է «int» տիպից մի փոքր փոքր չափս ունեցող տեսակների աճման և նվազեցման գործողությունների հետ կապված խնդիրները հայտնաբերելու համար:
  • x86 թիրախային ճարտարապետություններ ընտրելիս «-march=skylake-avx512», «-march=icelake-client», «-march=icelake-server», «-march=cascadelake» և «-march=cooperlake» լռելյայնորեն վեկտորացված: կոդը դադարել է օգտագործել 512-բիթանոց zmm ռեգիստրները, բացառությամբ սկզբնաղբյուրում դրանց ուղղակի նշման: Պատճառն այն է, որ պրոցեսորի հաճախականությունը նվազում է 512-բիթանոց գործողություններ կատարելիս, ինչը կարող է բացասաբար ազդել ընդհանուր աշխատանքի վրա: Նոր վարքագիծը փոխելու համար տրամադրվում է «-mprefer-vector-width=512» տարբերակը։
  • «-flax-vector-conversions» դրոշի վարքագիծը նման է GCC-ին. արգելվում է անուղղակի վեկտորային բիթերի փոխարկումը ամբողջ թվերի և լողացող կետով վեկտորների միջև: Այս սահմանափակումը վերացնելու համար առաջարկվում է օգտագործել դրոշը
    «-flax-vector-conversions=all», որը լռելյայն է:

  • Բարելավված աջակցություն Octeon ընտանիքի MIPS պրոցեսորներին: Ավելացվեց «octeon+» պրոցեսորի վավեր տեսակների ցանկին:
  • WebAssembly միջանկյալ կոդի մեջ հավաքվելիս ավտոմատ կերպով կանչվում է wasm-opt optimizer, եթե առկա է համակարգում:
  • RISC-V ճարտարապետության վրա հիմնված համակարգերի համար լողացող կետի արժեքները պահող ռեգիստրների օգտագործումը թույլատրվում է հավաքիչի ներդիրային ներդիրների պայմանական բլոկներում:
  • Ավելացվել են կոմպիլյատորների նոր դրոշակներ՝ «-fgnuc-version»՝ «__GNUC__» և նմանատիպ մակրոների տարբերակի արժեքը սահմանելու համար; «-fmacro-prefix-map=OLD=NEW»՝ գրացուցակի նախածանցը ՀԻՆ ՆՈՐով փոխարինելու համար մակրոներում, ինչպիսիք են «__FILE__»; «-fpatchable-function-entry=N[,M]»՝ ֆունկցիայի մուտքի կետից առաջ և հետո որոշակի քանակությամբ NOP հրահանգներ ստեղծելու համար: RISC-V-ի համար
    ավելացրել է աջակցություն «-fixed-xX», «-mcmodel=medany» և «-mcmodel=medlow» դրոշներին:

  • Ավելացվել է աջակցություն '__attribute__((target("branch-protection=..."))) հատկանիշին, որի էֆեկտը նման է տարբերակին -մասնաճյուղի պաշտպանություն.
  • Windows հարթակում, «-cfguard» դրոշը նշելիս, կատարվում է կատարման հոսքի ամբողջականության ստուգումների փոխարինում (Control Flow Guard) անուղղակի ֆունկցիայի կանչերով: Չեկի փոխարինումն անջատելու համար կարող եք օգտագործել «-cfguard-nochecks» դրոշակը կամ «__declspec(guard(nocf))» փոփոխիչը:
  • Gnu_inline հատկանիշի վարքագիծը նման է GCC-ին այն դեպքերում, երբ այն օգտագործվում է առանց «արտաքին» բանալի բառի:
  • Ընդլայնվել են OpenCL և CUDA աջակցության հետ կապված հնարավորությունները: Ավելացված է աջակցություն OpenMP 5.0 նոր հնարավորությունների համար:
  • Clang-format հավելվածին ավելացվել է Ստանդարտ տարբերակ, որը թույլ է տալիս որոշել C++ ստանդարտի տարբերակը, որն օգտագործվում է կոդի վերլուծության և ձևաչափման ժամանակ (Վերջին, Ավտո, c++03, c++11, c++14, c++17, c++20):
  • Ստատիկ անալիզատորին ավելացվել են նոր ստուգումներ՝ alpha.cplusplus.PlacementNew՝ որոշելու համար, թե արդյոք կա բավարար պահեստային տարածք, fuchsia.HandleChecker՝ Fuchsia մշակողների հետ կապված արտահոսքերը հայտնաբերելու համար, security.insecureAPI.decodeValueOfObjCType՝ բուֆերային պոտենցիալ արտահոսքը հայտնաբերելու համար, երբ օգտագործվում է [NSCodebCTFOdebCTFOdebCType: :at:] .
  • Undefined Behavior Sanitizer (UBSan) ընդլայնել է իր ցուցիչի արտահոսքի ստուգումները՝ պարզելու NULL ցուցիչների նկատմամբ ոչ զրոյական շեղումների կիրառումը կամ արդյունքում NULL ցուցիչի օֆսեթի ավելացումը:
  • Լինտերի մեջ՝ կոկիկ ավելացրել է նոր չեկերի մեծ մասը.

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

  • Շրջանակին Վերագրող Ավելացվել են նոր միջընթացակարգային օպտիմալացումներ և անալիզատորներ: Կանխատեսվում է 19 տարբեր ատրիբուտների վիճակը, այդ թվում՝ 12 հատկանիշ՝ 12 LLVM IR և 7 աբստրակտ հատկանիշ, ինչպիսին է կենդանիությունը։
  • Կոմպիլյատորում ներկառուցված նոր մատրիցային մաթեմատիկական ֆունկցիաներ են ավելացվել (Ինտրինսիկա), որոնք կոմպիլյացիայի ժամանակ փոխարինվում են արդյունավետ վեկտորային հրահանգներով։
  • Բազմաթիվ բարելավումներ են կատարվել X86, AArch64, ARM, SystemZ, MIPS, AMDGPU և PowerPC ճարտարապետությունների backend-ներում: Ավելացվեց պրոցեսորի աջակցություն
    Cortex-A65, Cortex-A65AE, Neoverse E1 և Neoverse N1: ARMv8.1-M-ի համար կոդերի ստեղծման գործընթացը օպտիմիզացվել է (օրինակ, հայտնվել է նվազագույն վերադիր օղակների աջակցություն) և ավելացվել է ավտոմատ վեկտորացման աջակցություն՝ օգտագործելով MVE ընդլայնումը: Բարելավված CPU MIPS Octeon աջակցություն: PowerPC-ի համար մաթեմատիկական ենթածրագրերի վեկտորացումը MASSV (Mathematical Acceleration SubSystem) գրադարանի միջոցով միացված է, կոդերի ստեղծումը բարելավված է, և օպտիմիզացված է հիշողության հասանելիությունը օղակներից: x86-ի համար փոխվել է v2i32, v4i16, v2i16, v8i8, v4i8 և v2i8 վեկտորի տեսակների կառավարումը:

  • Բարելավված կոդերի գեներատոր WebAssembly-ի համար: Ավելացվեց աջակցություն TLS (Thread-Local Storage) և atomic.fence հրահանգներին: SIMD-ի աջակցությունը զգալիորեն ընդլայնվել է: WebAssembly օբյեկտի ֆայլերն այժմ հնարավորություն ունեն օգտագործելու բազմարժեք ֆունկցիայի ստորագրություններ:
  • Անալիզատորն օգտագործվում է օղակների մշակման ժամանակ MemorySSA, որը թույլ է տալիս սահմանել կախվածություն տարբեր հիշողության գործողությունների միջև: MemorySSA-ն կարող է նվազեցնել կազմման և կատարման ժամանակը կամ կարող է օգտագործվել AliasSetTracker-ի փոխարեն՝ առանց կատարողականի կորստի:
  • LLDB կարգաբերիչը զգալիորեն բարելավել է DWARF v5 ձևաչափի աջակցությունը: Բարելավված աջակցություն MinGW-ով կառուցելու համար
    և ավելացրել է Windows-ի գործադիրները ARM և ARM64 ճարտարապետությունների համար վրիպազերծելու նախնական հնարավորությունը: Ավելացվել է ներդիրի ավտոմատ լրացման ժամանակ առաջարկվող ընտրանքների նկարագրությունները՝ սեղմելով ներդիրը:

  • Ընդլայնված LLD կապող հնարավորություններ: ELF ձևաչափի բարելավված աջակցություն, ներառյալ GNU կաղապարների ամբողջական համատեղելիության ապահովումը, սեղմված վրիպազերծման բաժինների «.zdebug» աջակցությունը, PT_GNU_PROPERTY հատկությունը՝ .note.gnu.property բաժինը սահմանելու համար (կարող է օգտագործվել ապագայում) Linux միջուկներ),
    Իրականացվել են «-z noseparate-code», «-z individual-code» և «-z individual-loadable-segments» ռեժիմները: Բարելավված աջակցություն MinGW-ի և WebAssembly-ի համար:

Source: opennet.ru

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