Hoʻokuʻu ʻia o ka LLVM 10.0 compiler suite

Ma hope o ʻeono mahina o ka hoʻomohala ʻana hōʻike ʻia hoʻokuʻu papahana LLVM 10.0 — ʻO nā mea hana like GCC (nā mea hoʻohui, optimizers a me nā code generators), ka hoʻopili ʻana i nā polokalamu i loko o ka bitcode waena o nā ʻōlelo aʻoaʻo virtual e like me RISC (mekini haʻahaʻa haʻahaʻa me kahi ʻōnaehana hoʻonohonoho multi-level). Hiki ke hoʻololi ʻia ka pseudocode i hana ʻia me ka hoʻohana ʻana i kahi compiler JIT i nā kuhikuhi mīkini pololei i ka manawa o ka hoʻokō ʻana o ka papahana.

Loaʻa nā hiʻohiʻona hou i ka LLVM 10.0 i ke kākoʻo no C ++ Concepts, ʻaʻole holo hou ʻo Clang ma ke ʻano he kaʻina kaʻawale, kākoʻo no ka CFG (control flow guard) nānā no Windows, a me ke kākoʻo no nā mana CPU hou.

Nā hoʻomaikaʻi ma Clang 10.0:

  • Hoʻohui kākoʻo no "ka manaʻo", kahi hoʻonui template C++ e hoʻokomo ʻia i ka maʻamau aʻe, codenamed C++2a (hoʻohuli ʻia e ka hae -std=c++2a).
    Hāʻawi nā manaʻo iā ʻoe e wehewehe i kahi hoʻonohonoho o nā koi hoʻohālikelike template, i ka manawa hōʻuluʻulu, e kaupalena i ka hoʻonohonoho o nā hoʻopaʻapaʻa i hiki ke ʻae ʻia ma ke ʻano he mau ʻāpana template. Hiki ke hoʻohana ʻia nā manaʻo no ka pale ʻana i nā ʻano like ʻole ma waena o nā waiwai o nā ʻano ʻikepili i hoʻohana ʻia i loko o ka template a me nā waiwai ʻano ʻikepili o nā ʻāpana hoʻokomo.

    template
    manaʻo EqualityComparable = pono(T a, T b) {
    {a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Ma ka maʻamau, hoʻopau ʻia ka hoʻomaka ʻana o kahi kaʻina hana ʻokoʻa ("clang -cc1") kahi i hana ʻia ai ka hui ʻana. Hana ʻia ka hui ʻana ma ke kaʻina hana nui, a hiki ke hoʻohana ʻia ke koho "-fno-integrated-cc1" e hoʻihoʻi i ka hana kahiko.
  • Nā ʻano hana diagnostic hou:
    • "-Wc99-designator" a me "-Wreorder-init-list" e aʻo aku i ka hoʻohana ʻana i nā mea hoʻomaka C99 ma ke ʻano C++ i nā hihia inā pololei lākou ma C99 akā ʻaʻole ma C ++ 20.
    • "-Wsizeof-array-div" - hopu i nā kūlana e like me "int arr[10]; …sizeof(arr) / sizeof(short)…” (pono e “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - e aʻo aku i ka hoʻohana ʻana i nā mea hana e like me ka hoʻohana ʻana i ka mea hoʻohana "^" (xor) i nā hana i hiki ke huikau me ka exponentiation (2^16).
    • "-Wfinal-dtor-non-final-class" - e aʻo e pili ana i nā papa i kaha ʻole ʻia me ka "hope" specifier, akā he mea luku me ke ʻano "hope".
    • ʻO "-Wtautological-bitwise-compare" he pūʻulu o nā ʻōlelo aʻo no ka ʻike ʻana i nā hoʻohālikelike tautological ma waena o kahi hana bitwise a me ka mea mau, a no ka ʻike ʻana i nā hoʻohālikelike mau-ʻoiaʻiʻo i hoʻopili ʻia ka hana bitwise OR i kahi helu ʻino ʻole.
    • Hoʻomaopopo ka "-Wbitwise-conditional-parentheses" i nā pilikia i ka hoʻohui ʻana i nā mea hoʻohana loiloi AND (&) a me OR (|) me ka mea hoʻohana kūlana (?:).
    • "-Wmisleading-indentation" he analogue ia o ka helu o ka inoa like mai GCC, e ao ana e pili ana i na olelo indented me he mea la he hapa lakou o ka poloka if/else/no/while, aka, aole lakou i komo iloko o keia poloka. .
    • Ke hōʻike nei i ka "-Wextra", ua ʻae ʻia ka nānā "-Wdeprecated-copy", e ʻōlelo ana e pili ana i ka hoʻohana ʻana i nā mea hana.
      "neʻe" a "kope" i loko o nā papa me ka wehewehe wehewehe destructor.

    • Ua hoʻonui ʻia ka "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis".
    • Ua pio nā māka "-Wbitwise-op-parentheses" a me "-Wlogical-op-parentheses".
  • Ma ke code C a me C++, ʻae ʻia nā hana helu helu pointer ma nā arrays. ʻO ka Undefined Behavior Sanitizer ma ke ʻano "-fsanitize=pointer-overflow" i kēia manawa e hopu i nā hihia e like me ka hoʻohui ʻana i ka offset non-zero i kahi pointer null a i ʻole ka hana ʻana i kahi pointer null i ka wā e unuhi ana i kahi integer mai kahi pointer null ʻole.
  • Hoʻololi ʻia ke ʻano "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) no ka ʻike ʻana i nā pilikia me ka hoʻonui a me ka hoʻemi ʻana i nā hana no nā ʻano me ka liʻiliʻi liʻiliʻi ma mua o ke ʻano "int".
  • Ke koho ʻana i nā hale kiʻi kiʻi x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" a me "-march=cooperlake" ma ka paʻamau i vectorized. Ua ho'ōki ke code i ka hoʻohana ʻana i nā papa inoa 512-bit zmm, koe wale nō ka hōʻike pololei ʻana i ke code kumu. ʻO ke kumu ka emi ʻana o ka CPU i ka wā e hana ana i nā hana 512-bit, hiki ke hoʻopilikia i ka hana holoʻokoʻa. No ka hoʻololi i ke ʻano hou, hāʻawi ʻia ke koho "-mprefer-vector-width=512".
  • Ua like ke ano o ka hae "-flax-vector-conversions" me GCC: ua kapu ka hoololi ana i ka bit vector implicit ma waena o ka integer a me ka floating-point vectors. No ka hoʻopau ʻana i kēia palena, ua manaʻo ʻia e hoʻohana i ka hae
    "-flax-vector-conversions=all" ʻo ia ka paʻamau.

  • Hoʻonui i ke kākoʻo no nā MIPS CPU o ka ʻohana Octeon. Hoʻohui ʻia "octeon+" i ka papa inoa o nā ʻano CPU kūpono.
  • I ka hui ʻana i ka code intermediate WebAssembly, kāhea ʻia ka wasm-opt optimizer, inā loaʻa i ka ʻōnaehana.
  • No nā ʻōnaehana e pili ana i ka hoʻolālā RISC-V, ua ʻae ʻia ka hoʻohana ʻana i nā papa inoa e mālama ana i nā waiwai lana i loko o nā poloka kūlana o nā mea hoʻokomo inline.
  • Hoʻohui ʻia nā hae hōʻuluʻulu hou: "-fgnuc-version" e hoʻonohonoho i ka waiwai mana no "__GNUC__" a me nā macros like; "-fmacro-prefix-map=OLD=NEW" e hoʻololi i ka prefix papa kuhikuhi OLD me HOU ma nā macros e like me "__FILE__"; "-fpatchable-function-entry=N[,M]" e hana i kekahi helu o nā ʻōlelo kuhikuhi NOP ma mua a ma hope o ka helu komo hana. No RISC-V
    hoʻohui i ke kākoʻo no nā hae "-ffixed-xX", "-mcmodel=medany" a me "-mcmodel=medlow".

  • Hoʻohui i ke kākoʻo no ka '__attribute__((target("branch-protection=..."))) attribute, ka hopena o ia mea e like me ke koho. -pale-mbranch.
  • Ma ka paepae Windows, i ka wā e kuhikuhi ana i ka hae "-cfguard", hoʻokō ʻia ka hoʻololi ʻana i ka hoʻokō pono o ka holo ʻana (Control Flow Guard) no nā kelepona hana ʻole. No ka hoʻopau ʻana i ka hoʻololi ʻana, hiki iā ʻoe ke hoʻohana i ka hae "-cfguard-nochecks" a i ʻole ka "__declspec(guard(nocf))" hoʻololi.
  • ʻO ke ʻano o ke ʻano gnu_inline e like me GCC i nā hihia i hoʻohana ʻia me ka ʻole o ka huaʻōlelo "waho".
  • Ua hoʻonui ʻia nā mana e pili ana me OpenCL a me CUDA. Hoʻohui i ke kākoʻo no nā hiʻohiʻona OpenMP 5.0 hou.
  • Ua hoʻohui ʻia kahi koho maʻamau i ka clang-format utility, e hiki ai iā ʻoe ke hoʻoholo i ka mana o ka maʻamau C++ i hoʻohana ʻia i ka wā e parsing a me ka hoʻopili ʻana i ke code (Latest, Auto, c++03, c++11, c++14, c++17, c++20 ).
  • Ua hoʻohui ʻia nā hōʻoia hou i ka mea hoʻoponopono static: alpha.cplusplus.PlacementNew e hoʻoholo ai inā lawa ka wahi e waiho ai, fuchsia.HandleChecker e ʻike i nā leaks e pili ana i nā mea lawelawe Fuchsia, security.insecureAPI.decodeValueOfObjCType e ʻike i ka nui o ka pale i ka wā e hoʻohana ai i ka [NSCoder decodeValueypeOfOf. : ma:] .
  • Ua hoʻonui ka Undefined Behavior Sanitizer (UBSan) i kāna mau kikoʻī overflow no ka hopu ʻana i ka noi ʻana o nā offsets non-zero i nā pointers NULL a i ʻole ka hopena o ka hoʻohui ʻana o kahi NULL pointer offset.
  • Ma ka linter clang-tidy hoʻohui ʻia ka hapa nui o nā loiloi hou.

ka papa kuhikuhiE nā mea hou LLVM 10.0:

  • I ke kahua Mea hoʻohui Ua hoʻohui ʻia nā loiloi interprocedural hou a me nā loiloi. Ua wānana ʻia ka mokuʻāina o 19 mau ʻano like ʻole, me 12 mau ʻano 12 LLVM IR a me 7 mau ʻano abstract e like me ke ola.
  • Hoʻohui ʻia nā hana makemakika matrix hou i kūkulu ʻia i loko o ka compiler (Intrinsics), i hoʻololi ʻia e nā ʻōlelo kuhikuhi vector kūpono i ka wā o ka hōʻuluʻulu ʻana.
  • Nui nā hoʻomaikaʻi i hana ʻia i nā backends no X86, AArch64, ARM, SystemZ, MIPS, AMDGPU a me PowerPC architectures. Pākuʻi kākoʻo CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 a me Neoverse N1. No ARMv8.1-M, ​​ua hoʻonui ʻia ke kaʻina hana code (no ka laʻana, ua ʻike ʻia ke kākoʻo no nā puka lou me ka liʻiliʻi o luna) a ua hoʻohui ʻia ke kākoʻo no ka autovectorization me ka hoʻonui ʻana i ka MVE. Hoʻomaikaʻi ʻia ke kākoʻo CPU MIPS Octeon. No PowerPC, hoʻohana ʻia ka vectorization o nā subroutine makemakika e hoʻohana ana i ka waihona MASSV (Mathematical Acceleration SubSystem), hoʻomaikaʻi ʻia ka hana code, a hoʻomaikaʻi ʻia ka hoʻomanaʻo ʻana mai nā puka lou. No x86, ua hoʻololi ʻia ka lawelawe ʻana o nā ʻano vector v2i32, v4i16, v2i16, v8i8, v4i8 a me v2i8.

  • Hoʻomaikaʻi i nā code generator no WebAssembly. Kākoʻo hoʻohui ʻia no TLS (Thread-Local Storage) a me nā ʻōlelo kuhikuhi atomic.fence. Ua hoʻonui nui ʻia ke kākoʻo SIMD. Hiki i nā faila WebAssembly ke hoʻohana i nā pūlima hana waiwai nui.
  • Hoʻohana ʻia ka mea loiloi i ka wā e hana ai i nā puka lou MemorySSA, hiki iā ʻoe ke wehewehe i nā hilinaʻi ma waena o nā hana hoʻomanaʻo like ʻole. Hiki i ka MemorySSA ke hōʻemi i ka hoʻohui ʻana a me ka manawa hoʻokō a hiki ke hoʻohana ʻia ma kahi o AliasSetTracker me ka ʻole o ka nalowale o ka hana.
  • Ua hoʻomaikaʻi nui ka LLDB debugger i ke kākoʻo no ka format DWARF v5. Hoʻonui i ke kākoʻo no ke kūkulu ʻana me MinGW
    a hoʻohui i ka mana mua e hoʻopau i nā mea hoʻokō Windows no ka hale hoʻolālā ARM a me ARM64. Hoʻohui ʻia nā wehewehe o nā koho i hāʻawi ʻia i ka hoʻopiha ʻana i ka hoʻokomo ma ke kaomi ʻana i ka pā.

  • Hoʻonui ʻia LLD linker hiki. Hoʻomaikaʻi i ke kākoʻo no ka format ELF, me ka hōʻoia ʻana i ka hoʻokō piha ʻana o nā template glob me ka linker GNU, me ka hoʻohui ʻana i ke kākoʻo no nā ʻāpana debug compressed ".zdebug", e hoʻohui i ka waiwai PT_GNU_PROPERTY e wehewehe i ka ʻāpana .note.gnu.property (hiki ke hoʻohana i ka wā e hiki mai ana. Linux kernels),
    Ua hoʻokō ʻia nā ʻano "-z noseparate-code", "-z separate-code" a me "-z separate-loadable-segments". Hoʻonui i ke kākoʻo no MinGW a me WebAssembly.

Source: opennet.ru

Pākuʻi i ka manaʻo hoʻopuka