Rakirina berhevoka berhevkarê LLVM 10.0

Piştî şeş mehan ji pêşveçûnê pêşkêş kirin serbestberdana projeyê LLVM 10.0 - Amûrên lihevhatî yên GCC (berhevkar, optimîzator û hilberînerên kodê), berhevkirina bernameyan di bitkoda navîn a rêwerzên virtual yên mîna RISC (makîna virtual ya nizm bi pergalek xweşbînkirina pir-astî). Pseudokoda hatî çêkirin dikare bi karanîna berhevkarek JIT-ê rasterast di dema pêkanîna bernameyê de li rêwerzên makîneyê were veguheztin.

Taybetmendiyên nû yên di LLVM 10.0 de piştgirî ji bo têgînên C++, êdî Clang wekî pêvajoyek cihêreng nameşe, piştgirî ji bo kontrolên CFG (parastina herikîna kontrolê) ji bo Windows, û piştgirî ji bo kapasîteyên nû yên CPU.

Pêşkeftinên di Clang 10.0 de:

  • Piştgiriya zêdekirî ji bo "têgehên", pêvekek şablonê C++ ya ku dê di standarda paşîn de, bi navê kod C++2a (ji hêla ala -std=c++2a ve hatî veguheztin) de cîh bigire.
    Têgihan dihêle hûn komek hewcedariyên pîvana şablonê diyar bikin ku, di dema berhevkirinê de, komek argumanên ku dikarin wekî pîvanên şablonê bêne pejirandin sînordar bikin. Têgîn dikarin werin bikar anîn da ku ji nakokiyên mentiqî yên di navbera taybetmendiyên celebên daneyê yên ku di nav şablonê de têne bikar anîn û taybetmendiyên celebê daneya pîvanên têketinê de dûr bisekinin.

    şablon
    têgehek Wekhevî Berhevkar = hewce dike (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Bi xwerû, destpêkirina pêvajoyek cihêreng ("clang -cc1") ku tê de berhevok tê kirin, tê sekinandin. Berhevkirin naha di pêvajoya sereke de tête kirin, û vebijarka "-fno-integrated-cc1" dikare were bikar anîn da ku tevgera kevin sererast bike.
  • Modên nû yên tespîtkirinê:
    • "-Wc99-designator" û "-Wreorder-init-list" hişyariyê didin ku di moda C++ de destpêkerên C99 bikar bînin di rewşên ku ew di C99 de rast in lê ne di C++20 de ne.
    • "-Wsizeof-array-div" - rewşên wekî "int arr[10] digire; …sizeof(arr) / sizeof(kurt)…” (divê bibe “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - li hember karanîna avahîyên wekî karanîna operatora "^" (xor) di operasyonên ku dikarin bi mezinbûnê (2^16) re werin tevlihev kirin hişyar dike.
    • "-Wfinal-dtor-non-final-class" - li ser çînên ku bi diyarkera "dawî" nayên nîşankirin, lê xwedan xerakerek bi taybetmendiya "dawî" hişyar dike.
    • "-Wtautological-bitwise-compare" komek hişyarî ye ji bo teşhîskirina danberhevên tatolojîk ên di navbera operasyonek bitwise û domdar de, û ji bo destnîşankirina danberhevên her dem rast ên ku tê de operasyona OR-ê ya bitwise li hejmarek ne-neyînî tê sepandin.
    • "-Wbitwise-conditional-paranteses" dema ku operatorên mentiqî AND (&) û OR (|) bi operatorê şertî (?:) re tevlihev bikin, pirsgirêkan hişyar dike.
    • "-Wmisleading-indentation" analogek kontrolê ya bi heman navî ya ji GCC ye, ku hişyarî dide li ser biwêjên binavkirî mîna ku ew beşek in ji blokek heke / din / ji bo / dema ne, lê bi rastî ew di vê blokê de ne. .
    • Dema ku "-Wextra" diyar dike, kontrolkirina "-Wdeprecated-copy" tê çalak kirin, di derbarê karanîna çêkeran de hişyarî dide.
      "tevger" û "kopî" di dersan de bi pênaseyek wêranker a eşkere.

    • Kontrolên "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" hatine kontrol kirin.
    • Kontrolên "-Wbitwise-op-parentheses" û "-Wlogical-op-parentheses" ji hêla xwerû ve neçalak in.
  • Di koda C û C++ de, operasyonên arîtmetîk ên nîşanker tenê di rêzan de têne destûr kirin. Di moda "-fsanitize=pointer-overflow" de Paqijkera Nedîyarkirî naha rewşên wekî lêzêdekirina veqetandekek ne-sifir li nîşanek null an çêkirina nîşankerek betal dema ku jimareyek ji nîşankerek ne-nûl derdixe digire.
  • Moda "-fsanitize=veguhertina nenas" (Sanitizera Veguheztina Nefermî) ji bo tesbîtkirina pirsgirêkên bi operasyonên zêdekirin û kêmkirinê ji bo celebên bi pîvanek piçûktir ji ya celebê "int" tête adaptekirin.
  • Dema ku mîmarên x86-ê yên armanc hildibijêrin "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" û "-march=cooperlake" bi xweber di vektorî de kod bikaranîna qeydên zmm 512-bit rawestiyaye, ji bilî nîşana rasterast a wan di koda çavkaniyê de. Sedem ev e ku frekansa CPU dema ku karûbarên 512-bit pêk tîne kêm dibe, ku dikare bandorek neyînî li performansa giştî bike. Ji bo guhertina tevgera nû, vebijarka "-mprefer-vector-width=512" tê peyda kirin.
  • Tevgera ala "-flax-vector-conversions" dişibihe GCC: Veguheztinên bit-vektorê yên nepenî yên di navbera vektorên yekjimar û vektorên xala herikîn de qedexe ne. Ji bo rakirina vê sînordariyê, tê pêşniyar kirin ku ala bikar bînin
    "-flax-vector-conversions=hemû" ku xwerû ye.

  • Piştgiriya çêtirîn ji bo CPU-yên MIPS yên malbata Octeon. "octeon+" li navnîşa celebên CPU yên derbasdar zêde kir.
  • Dema ku di koda navberê ya WebAssembly de kom dibe, ger di pergalê de hebe, optimîzatorê wasm-opt bixweber tê gazî kirin.
  • Ji bo pergalên ku li ser bingeha mîmariya RISC-V-ê têne çêkirin, karanîna tomarên ku nirxên xala herikîn hildigirin di blokên şertî yên têkelên navmalî yên berhevkar de destûr tê dayîn.
  • Alên berhevkerê nû lê zêde kirin: "-fgnuc-version" ji bo danîna nirxa guhertoyê ji bo "__GNUC__" û makroyên mîna; "-fmacro-prefix-map=OLD=NEW" ku di makroyên wek "__FILE__" de pêşgira pelrêça OLD bi NEW veguherîne; "-fpatchable-function-entry=N[,M]" ji bo hilberîna çend rêwerzên NOP berî û piştî xala têketina fonksiyonê. Ji bo RISC-V
    ji bo alayên "-fixed-xX", "-mcmodel=medany" û "-mcmodel=medlow" piştgirî zêde kir.

  • Piştgiriyek ji bo taybetmendiya '__attribute__((target("branch-protection=..."))) zêde kir, ku bandora wê dişibihe vebijarkê -şax-parastin.
  • Li ser platforma Windows-ê, dema ku ala "-cfguard" tête diyar kirin, veguheztina kontrolên yekrêziya herikîna darvekirinê (Control Flow Guard) ji bo bangên fonksiyonê nerasterast tê pêkanîn. Ji bo neçalakkirina cîgirkirina kontrolê, hûn dikarin ala "-cfguard-nochecks" an guhêrbar "__declspec(guard(nocf))" bikar bînin.
  • Tevgera taybetmendiya gnu_inline di rewşên ku bêyî keyworda "derve" tê bikar anîn mîna GCC ye.
  • Kapasîteyên ku bi piştgiriya OpenCL û CUDA ve girêdayî ne hatine berfireh kirin. Piştgiriya ji bo taybetmendiyên nû yên OpenMP 5.0 zêde kir.
  • Vebijêrkek Standard li kargêriya clang-format hate zêdekirin, ku dihêle hûn guhertoya standarda C++-ê ya ku dema parskirin û formatkirina kodê tê bikar anîn destnîşan bikin (Nûtirîn, Xweser, c++03, c++11, c++14, c++17, c++20).
  • Kontrolên nû li analyzera statîk hatin zêdekirin: alpha.cplusplus.PlacementNew da ku diyar bike ka cîhê hilanînê têra xwe heye, fuchsia.HandleChecker ji bo tespîtkirina levhatinên têkildarî hilgirên Fuchsia, security.insecureAPI.decodeValueOfObjCType ji bo tespîtkirina zêdebariyên tamponê yên potansiyelOfObjCType dema ku bikar bîne [NSVjalueder :at:] .
  • Paqijkera Behavior a Nedîyar (UBSan) kontrolên xwe yên zêdekirina nîşankerê berfireh kiriye da ku sepana ne-sifir li ser nîşankerên NULL an jî lêzêdekirina encamek nîşankerek NULL bigire.
  • Di linter clang-tidy zêde kirin beşek mezin ji kontrolên nû.

sereke nûbûnên LLVM 10.0:

  • Di çarçoveya Attributor Optimîzasyon û analîzên nû yên navprocedural hatine zêdekirin. Rewşa 19 taybetmendiyên cihêreng tê pêşbînîkirin, di nav de 12 taybetmendî 12 LLVM IR û 7 taybetmendiyên razber ên wekî zindîbûn.
  • Fonksiyonên matematîkî yên matrixê yên nû ku di berhevkerê de hatine çêkirin (Intrinsics), ku di dema berhevkirinê de bi rêwerzên vektorê yên bikêr têne veguheztin.
  • Ji bo mîmarên X86, AArch64, ARM, SystemZ, MIPS, AMDGPU û PowerPC gelek çêtirkirin li paşvekêşan hatine çêkirin. Piştgiriya CPU zêde kir
    Cortex-A65, Cortex-A65AE, Neoverse E1 û Neoverse N1. Ji bo ARMv8.1-M, ​​pêvajoya hilberîna kodê xweştir bûye (mînakî, piştgirî ji bo lûleyên bi serê hindiktirîn xuya bûye) û piştgirî ji bo autovectorization bi karanîna dirêjkirina MVE ve hatî zêdekirin. Piştgiriya CPU MIPS Octeon çêtir kirin. Ji bo PowerPC-ê, vektorîzekirina binavûdengên matematîkî yên ku bi karanîna pirtûkxaneya MASSV (Sînstema Lezkirina Mathematical Lezgîn) tê çalak kirin, hilberîna kodê çêtir dibe, û gihandina bîranînê ji lûpkan xweştir dibe. Ji bo x86, birêvebirina celebên vektorê v2i32, v4i16, v2i16, v8i8, v4i8 û v2i8 hatiye guhertin.

  • Ji bo WebAssembly hilberînerê kodê çêtir kirin. Piştgiriya ji bo TLS (Thread-Local Storage) û rêwerzên atomic.fence zêde kir. Piştgiriya SIMD bi girîngî hate berfireh kirin. Pelên objeya WebAssembly naha xwedan şiyana karanîna îmza fonksiyonên pir-nirxdar in.
  • Analîzator dema ku pêlavan hildiberîne tê bikar anîn MemorySSA, ku dihêle hûn di navbera operasyonên bîranînê yên cihêreng de pêwendiyan diyar bikin. MemorySSA dikare dema berhevkirin û darvekirinê kêm bike an jî bêyî windakirina performansê li şûna AliasSetTracker were bikar anîn.
  • Debugger LLDB ji bo formata DWARF v5 piştgirî pir çêtir kiriye. Piştgiriya çêtirîn ji bo avakirina bi MinGW re
    û şiyana destpêkê zêde kir ku ji bo mîmariya ARM û ARM64-ê çêkerên Windows-ê rast bike. Danasînên vebijarkên ku dema bixweber temamkirina têketinê bi tikandina tabê têne pêşkêş kirin zêde kirin.

  • Berfireh kirin Kapasîteyên girêdana LLD. Piştgiriya pêşkeftî ya ji bo formata ELF, di nav de lihevhatina tam a şablonên gerdûnî yên bi girêdana GNU re, piştgirî zêde kir ji bo beşên debug-ê yên pêçandî ".zdebug", taybetmendiya PT_GNU_PROPERTY zêde kir da ku beşa .note.gnu.property diyar bike (dikare di Linuxa pêşerojê de were bikar anîn kernel),
    Modên "-z noseparate-code", "-z veqetandî-kode" û "-z veqetandî-barker-beş" hatine bicîh kirin. Piştgiriya çêtirîn ji bo MinGW û WebAssembly.

Source: opennet.ru

Add a comment