Sgaoileadh an t-sreath cruinneachaidh LLVM 10.0

Às deidh sia mìosan de leasachadh air a thaisbeanadh foillseachadh pròiseict LLVM 10.0 - Innealan a tha co-chosmhail ri GCC (luchd-cruinneachaidh, optimizers agus gineadairean còd), a’ cur ri chèile phrògraman ann an bitcode eadar-mheadhanach de stiùiridhean brìgheil coltach ri RISC (inneal brìgheil ìre ìosal le siostam optimization ioma-ìre). Faodar am pseudocode a chaidh a chruthachadh a thionndadh le bhith a’ cleachdadh inneal-cruinneachaidh JIT gu stiùireadh inneal gu dìreach aig àm coileanadh a’ phrògraim.

Tha feartan ùra ann an LLVM 10.0 a’ toirt a-steach taic airson C ++ Concepts, chan eil e a’ ruith Clang mar phròiseas air leth tuilleadh, taic airson sgrùdaidhean CFG (geàrd sruthadh smachd) airson Windows, agus taic airson comasan CPU ùra.

Leasachaidhean ann an Clang 10.0:

  • Taic a bharrachd airson "a ’bheachd", leudachadh teamplaid C++ a thèid a ghabhail a-steach san ath inbhe, leis an t-ainm C++2a (air a thionndadh air leis a’ bhratach -std=c++2a).
    Leigidh bun-bheachdan leat seata de riatanasan paramadair teamplaid a mhìneachadh a bhios, aig àm cruinneachaidh, a’ cuingealachadh an t-seata argamaidean ris an gabhar mar pharaimearan teamplaid. Faodar na bun-bheachdan a chleachdadh gus neo-chunbhalachd loidsigeach a sheachnadh eadar feartan nan seòrsaichean dàta a thathar a’ cleachdadh taobh a-staigh an teamplaid agus feartan seòrsa dàta nam paramadairean cuir a-steach.

    teamplaid
    bun-bheachd EqualityComparable = feum (T a, T b) {
    { a == b } -> std ::boolean;
    { a != b } -> std ::boolean;
    };

  • Gu gnàthach, thèid stad a chuir air pròiseas air leth (“clang -cc1”) anns a bheilear a’ cur ri chèile. Tha an cruinneachadh a-nis air a dhèanamh sa phrìomh phròiseas, agus faodar an roghainn "-fno-integrated-cc1" a chleachdadh gus an seann ghiùlan a thoirt air ais.
  • Modhan breithneachaidh ùra:
    • Tha "-Wc99-designator" agus "-Wreorder-init-list" a' toirt rabhadh gun a bhith a' cleachdadh luchd-tòiseachaidh C99 ann am modh C++ ann an cùisean far a bheil iad ceart ann an C99 ach nach eil ann an C++20.
    • "-Wsizeof-array-div" - a 'glacadh shuidheachaidhean mar "int arr[10]; ...sizeof (arr) / sizeof (goirid)…” (bu chòir a bhith “sizeof(arr) / sizeof(int)”).
    • Tha "-Wxor-used-as-po" - a' toirt rabhadh gun a bhith cleachdadh structairean leithid cleachdadh a' ghnìomhaiche "^" (xor) ann an obraichean a dh'fhaodar a mheasgadh le mìneachadh (2^16).
    • "-Wfinal-dtor-non-final-class" - a 'toirt rabhadh mu chlasaichean nach eil air an comharrachadh leis an t-sònrachadh "deireannach", ach aig a bheil sgrios leis a' bhuadh "deireannach".
    • Tha "-Wtautological-bitwise-compare" na bhuidheann de rabhaidhean airson a bhith a’ lorg choimeasan tautological eadar obrachadh bitwise agus seasmhach, agus airson a bhith a’ comharrachadh choimeasan a tha an-còmhnaidh fìor anns a bheil an obrachadh bitwise OR air a chur an sàs ann an àireamh neo-àicheil.
    • Tha "-Wbitwise-conditional-parentheses" a’ toirt rabhadh mu dhuilgheadasan nuair a thathar a’ measgachadh gnìomhaichean loidsigeach AND (&) agus OR (|) leis a’ ghnìomhaiche cumhach (?:).
    • Tha “-Wmisleading-indentation” na analogue den t-seic den aon ainm bho GCC, a tha a’ toirt rabhadh mu abairtean indentation mar gum biodh iad nam pàirt de bhloc ma tha / eile / airson / fhad ‘s a tha iad, ach gu dearbh chan eil iad air an toirt a-steach don bhloc seo .
    • Nuair a bhios tu a’ sònrachadh “-Wextra”, tha an sgrùdadh “-Wdeprecated-copy” air a chomasachadh, rabhadh mu chleachdadh luchd-togail
      "gluasad" agus "lethbhreac" ann an clasaichean le mìneachadh soilleir air sgrios.

    • Chaidh na sgrùdaidhean "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" a leudachadh.
    • Tha na sgrùdaidhean “-Wbitwise-op-parentheses” agus “-Wlogical-op-parentheses” à comas a ghnàth.
  • Ann an còd C agus C ++, chan eil gnìomhachd àireamhachd puing ceadaichte ach ann an arrays. Bidh an Sanitizer Giùlan Neo-mhìnichte ann am modh “-fsanitize=pointer-overflow” a-nis a’ glacadh chùisean leithid cuir an-aghaidh neo-neoni ri puing neo-mhìnichte no cruthachadh puing neo-mhìnichte nuair a thathar a’ toirt air falbh slòigh bho phuing neo-null.
  • Tha am modh “-fsanitize = implicit-conversion” (Implicit Conversion Sanitizer) air atharrachadh gus duilgheadasan a chomharrachadh le gnìomhachd àrdachadh is lughdachadh airson seòrsaichean le meud beagan nas lugha na meud an t-seòrsa “int”.
  • Nuair a thaghas tu ailtireachd targaid x86 "-march = skylake-avx512", "-march = icelake-client", "-march = icelake-server", "-march = cascadelake" agus "-march = cooperlake" gu bunaiteach ann an vectorized The tha an còd air stad a bhith a’ cleachdadh chlàran zmm 512-bit, ach a-mhàin an comharradh dìreach anns a’ chòd stòr. Is e an t-adhbhar gu bheil tricead CPU a 'lùghdachadh nuair a bhios tu a' coileanadh obraichean 512-bit, a bheir droch bhuaidh air coileanadh iomlan. Gus an giùlan ùr atharrachadh, tha an roghainn "-mprefer-vector-width=512" air a thoirt seachad.
  • Tha giùlan a’ bhratach “-flax-vector-conversions” coltach ri GCC: thathas a’ toirmeasg atharrachaidhean bit vector so-thuigsinn eadar vectaran integer agus puing-fleòdraidh. Gus cur às don chuingealachadh seo, thathas a’ moladh am bratach a chleachdadh
    "-flax-vector-conversions=all" a tha mar an àbhaist.

  • Taic nas fheàrr airson CPUan MIPS den teaghlach Octeon. Chaidh “octeon+” a chur ris an liosta de sheòrsan CPU dligheach.
  • Nuair a bhios tu a’ cruinneachadh a-steach do chòd eadar-mheadhanach WebAssembly, thèid an wasm-opt optimizer a ghairm gu fèin-ghluasadach, ma tha e ri fhaighinn san t-siostam.
  • Airson siostaman stèidhichte air ailtireachd RISC-V, tha cleachdadh chlàran a tha a’ stòradh luachan puing-fleòdraidh ceadaichte ann am blocaichean le cumhachan de chuir a-steach in-loidhne cruinneachaidh.
  • Chaidh brataichean cruinneachaidh ùra a chur ris: "-fgnuc-version" gus luach an tionndaidh airson "__GNUC__" agus macros coltach ris a shuidheachadh; "-fmacro-prefix-map=OLD=NEW" gus ÙR a chur an àite an ro-leasachan eòlaire OLD ann am macros mar "__FILE__"; "-fpatchable-function-entry=N[,M]" gus àireamh sònraichte de stiùiridhean NOP a ghineadh ro agus às dèidh puing inntrigidh an gnìomh. Airson RISC-V
    taic a bharrachd dha na brataichean “-ffixed-xX”, “-mcmodel=medany” agus “-mcmodel=medlow”.

  • Taic a bharrachd don fheart '__attribute__((target("branch-protection=..."))), agus tha a' bhuaidh aige coltach ris an roghainn - meur-dìon.
  • Air àrd-ùrlar Windows, nuair a thathar a’ sònrachadh a’ bhratach “-cfguard”, thathar a’ cur an àite sgrùdaidhean ionracas sruthadh gnìomh (Control Flow Guard) airson gairmean gnìomh neo-dhìreach. Gus ionadachadh seic a chuir dheth, faodaidh tu am bratach “-cfguard-nochecks” no am mion-atharrachaidh “__declspec(guard(nocf))” a chleachdadh.
  • Tha giùlan a’ bhuadh gnu_inline coltach ri GCC ann an cùisean far a bheilear ga chleachdadh às aonais am prìomh fhacal “taobh a-muigh”.
  • Chaidh na comasan co-cheangailte ri taic OpenCL agus CUDA a leudachadh. Taic a bharrachd airson feartan ùra OpenMP 5.0.
  • Chaidh roghainn àbhaisteach a chuir ris a’ ghoireas cruth clang, a leigeas leat an dreach den inbhe C ++ a chaidh a chleachdadh nuair a bhios tu a’ parsadh agus a’ cruth còd a dhearbhadh (as ùire, Auto, c ++03, c ++11, c++14, c++17, c++20).
  • Chaidh sgrùdaidhean ùra a chuir ris an anailisiche statach: alpha.cplusplus.PlacementNew gus faighinn a-mach a bheil àite stòraidh gu leòr ann, fuchsia.HandleChecker gus aoidion co-cheangailte ri luchd-làimhseachaidh Fuchsia a lorg, tèarainteachd.insecureAPI.decodeValueOfObjCType gus tar-shruthan bufair a lorg nuair a bhios tu a’ cleachdadh [NSCoder decodebCCType :aig:].
  • Tha an Sanitizer Giùlan Neo-mhìnichte (UBSan) air na sgrùdaidhean thar-shruth puing aca a leudachadh gus grèim fhaighinn air cuir an sàs neo-neoni gu comharran NULL no cuir a-steach puing puing NULL mar thoradh air.
  • Ann an linter clang-tidy air a chur ris earrann mhòr de sgrùdaidhean ùra.

prìomh innleachdan LLVM 10.0:

  • Chun an fhrèam Fear-aithris Chaidh optimizations agus sgrùdairean eadar-mhodhan ùra a chur ris. Thathas a’ ro-innse staid 19 buadhan eadar-dhealaichte, a’ toirt a-steach 12 buadhan 12 LLVM IR agus 7 buadhan eas-chruthach leithid beòthalachd.
  • Chaidh gnìomhan matamataigeach matrix ùra a chuir a-steach don inneal-cruinneachaidh (Bun-bheachdan), a thèid an àite le stiùireadh vectar èifeachdach aig àm cur ri chèile.
  • Chaidh mòran leasachaidhean a dhèanamh air backends airson ailtireachd X86, AArch64, ARM, SystemZ, MIPS, AMDGPU agus PowerPC. Taic CPU air a chur ris
    Cortex-A65, Cortex-A65AE, Neoverse E1 agus Neoverse N1. Airson ARMv8.1-M, ​​chaidh am pròiseas gineadh còd a mheudachadh (mar eisimpleir, tha taic airson lùban le glè bheag de os cionn air nochdadh) agus chaidh taic airson autovectorization a chuir ris a’ cleachdadh an leudachadh MVE. Taic CPU MIPS Octeon nas fheàrr. Airson PowerPC, tha vectarization de fo-riaghailtean matamataigeach a’ cleachdadh leabharlann MASSV (Siostam Luathachaidh Matamataig) air a chomasachadh, tha gineadh còd air a leasachadh, agus tha ruigsinneachd cuimhne bho lùban air a mheudachadh. Airson x86, tha làimhseachadh seòrsaichean vector v2i32, v4i16, v2i16, v8i8, v4i8 agus v2i8 air atharrachadh.

  • Gineadair còd nas fheàrr airson WebAssembly. Taic a bharrachd airson TLS (Stòradh Thread-Local) agus stiùireadh atomic.fence. Tha taic SIMD air a leudachadh gu mòr. Tha comas aig faidhlichean cuspair WebAssembly a-nis ainmean-sgrìobhte gnìomh ioma-luach a chleachdadh.
  • Bidh an anailisiche air a chleachdadh nuair a bhios tu a’ làimhseachadh lùban CuimhneSSA, a leigeas leat eisimeileachd a mhìneachadh eadar diofar obrachaidhean cuimhne. Faodaidh MemorySSA an ùine cruinneachaidh is cur an gnìomh a lughdachadh no faodar a chleachdadh an àite AliasSetTracker gun a bhith a’ call coileanadh.
  • Tha an debugger LLDB air taic a leasachadh gu mòr airson cruth DWARF v5. Taic nas fheàrr airson togail le MinGW
    agus chuir e ris a’ chiad chomas a bhith a’ deasbaireachd Windows executables airson ailtireachd ARM agus ARM64. Tuairisgeul air a chur ris mu na roghainnean a thathar a’ tabhann nuair a chuireas tu a-steach gu fèin-obrachail le bhith a’ putadh taba.

  • Leudaichte Sgilean ceangail LLD. Taic nas fheàrr airson cruth ELF, a’ toirt a-steach dèanamh cinnteach gu bheil teamplaidean glob gu tur co-fhreagarrach leis a’ cheangal GNU, a’ cur taic ri earrannan deasbaid teann “.zdebug”, a’ cur an seilbh PT_GNU_PROPERTY gus an roinn .note.gnu.property a mhìneachadh (faodar a chleachdadh san àm ri teachd Linux kernels),
    Chaidh na modhan “-z noseparate-code”, “-z separate-code” agus “-z separate-loadable-segments” a chuir an gnìomh. Taic nas fheàrr airson MinGW agus WebAssembly.

Source: fosgailtenet.ru

Cuir beachd ann