เบ›เปˆเบญเบเบŠเบธเบ”เบ„เบญเบกเบžเบตเบงเป€เบ•เบต LLVM 9.0

เบซเบผเบฑเบ‡เบˆเบฒเบเบซเบปเบเป€เบ”เบทเบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ เบ™เบณ เบชเบฐ เป€เปœเบต เบเบฒเบ™เบ›เปˆเบญเบเป‚เบ„เบ‡เบเบฒเบ™ LLVM 9.0 โ€” เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบ—เบตเปˆโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบเบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบเบฑเบš GCC (เบ„เบญเบกโ€‹เบžเบดเบงโ€‹เป€เบ•เบต, optimizers เปเบฅเบฐโ€‹เบชเป‰เบฒเบ‡โ€‹เบฅเบฐโ€‹เบซเบฑเบ”), compiling เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™ bitcode เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบ›เบฒเบ™โ€‹เบเบฒเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เปเบ™เบฐโ€‹เบ™เปเบฒ virtual เป€เบŠเบฑเปˆเบ™ RISC (เป€เบ„เบทเปˆเบญเบ‡ virtual เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบ•โ€‹เปˆโ€‹เปโ€‹เบฒโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบซเบผเบฒเบโ€‹เบฅเบฐโ€‹เบ”เบฑเบš). เบฅเบฐเบซเบฑเบ” pseudocode เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เปˆเบฝเบ™เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบชเบฑเบ‡เบฅเบงเบก JIT เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเป‚เบ”เบเบเบปเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เป‚เบ„เบ‡เบเบฒเบ™.

เบฅเบฑเบเบชเบฐเบ™เบฐเปƒเบซเบกเปˆเบ‚เบญเบ‡ LLVM 9.0 เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบ–เบญเบ™เปเบ—เปเบเบเบฒเบ™เบญเบญเบเปเบšเบšเบ—เบปเบ”เบฅเบญเบ‡เบญเบญเบเบˆเบฒเบเปเบžเบฅเบฐเบ•เบฐเบŸเบญเบก RISC-V เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ C ++ เบชเปเบฒเบฅเบฑเบš OpenCL, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบ–เบทเบเป‚เบซเบฅเบ”เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปƒเบ™ LLD, เปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ” "asm goto", เปƒเบŠเป‰เปƒเบ™เบฅเบฐเบซเบฑเบ” Linux kernel. libc++ เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบš WASI (WebAssembly System Interface), เปเบฅเบฐ LLD เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เบญเบ‡ WebAssembly.

เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡ เปƒเบ™ Clang 9.0:

  • เป€เบžเบตเปˆเบกเปเบฅเป‰เบง เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡ GCC "asm gotoโ€œ, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบเป‰เบฒเบเบˆเบฒเบเบ•เบปเบงเบ›เบฐเบเบญเบš inline block เป„เบ›เบซเบฒเบ›เป‰เบฒเบเบŠเบทเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ” C. เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡ kernel Linux เปƒเบ™เป‚เปเบ” โ€œCONFIG_JUMP_LABEL=yโ€ เป‚เบ”เบเปƒเบŠเป‰ Clang เปƒเบ™เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบกเบตเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเบณ x86_64. เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเป€เบžเบตเปˆเบกเปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบเบญเบญเบเบกเบฒเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, kernel Linux เบ›เบฐเบˆเบธเบšเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ Clang เบชเปเบฒเบฅเบฑเบšเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ x86_64 (เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบชเปเบฒเบฅเบฑเบšเปเบ‚เบ™, aarch64, ppc32, ppc64le เปเบฅเบฐเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ mips). เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เป‚เบ„เบ‡เบเบฒเบ™ Android เปเบฅเบฐ ChromeOS เป„เบ”เป‰เบ–เบทเบเบ›เปˆเบฝเบ™เป„เบ›เปƒเบŠเป‰ Clang เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบเปˆเบ™, เปเบฅเบฐ Google เบเปเบฒเบฅเบฑเบ‡เบ—เบปเบ”เบชเบญเบš Clang เป€เบ›เบฑเบ™เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบกเบ•เบปเป‰เบ™เบ•เปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบเปˆเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบš Linux เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบกเบฑเบ™. เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”, เบญเบปเบ‡เบ›เบฐเบเบญเบš LLVM เบญเบทเปˆเบ™เป†เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ kernel, เบฅเบงเบกเบ—เบฑเบ‡ LLD, llvm-objcopy, llvm-ar, llvm-nm, เปเบฅเบฐ llvm-objdump;
  • เป€เบžเบตเปˆเบกเบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰ C++17 เปƒเบ™ OpenCL. เบฅเบฑเบเบชเบฐเบ™เบฐเบชเบฐเป€เบžเบฒเบฐเบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ, เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเป‚เบ”เบเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เบ›เบฐเป€เบžเบ”, เบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบ›เบฐเป€เบžเบ” vector เปƒเบ™ OpenCL เบชเปเบฒเบฅเบฑเบš C, เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” OpenCL เบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบฎเบนเบšเบžเบฒเบš, เป€เบซเบ”เบเบฒเบ™, เบŠเปˆเบญเบ‡เบ—เบฒเบ‡, เปเบฅเบฐเบญเบทเปˆเบ™เป†.
  • เป€เบžเบตเปˆเบกเบ—เบธเบ‡ compiler เปƒเปเปˆ โ€œ-ftime-traceโ€ เปเบฅเบฐ โ€œ-ftime-trace-granularity=Nโ€ เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฅเบฒเบเบ‡เบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡ frontend (parsing, initialization) เปเบฅเบฐ backend (optimization stages). เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เป„เบ”เป‰เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เบฎเบนเบšเปเบšเบš json, เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบš chrome://tracing เปเบฅเบฐ speedscope.app;
  • เป€เบžเบตเปˆเบกเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เบญเบ‡เบ•เบปเบงเบฅเบฐเบšเบธ โ€œ__declspec(เบœเบนเป‰เบˆเบฑเบ”เบชเบฑเบ™)โ€ เปเบฅเบฐเบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ”เบตเบšเบฑเบเบ—เบตเปˆเบกเบฒเบžเป‰เบญเบกเบเบฑเบšเบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก Visual Studio;
  • เบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒ C, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเบชเปเบฒเบฅเบฑเบš "__FILE_NAME__" macro, เป€เบŠเบดเปˆเบ‡เบ„เป‰เบฒเบเบ„เบทเบเบฑเบš "__FILE__" macro, เปเบ•เปˆเบ›เบฐเบเบญเบšเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบŠเบทเปˆเป„เบŸเบฅเปŒเบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป€เบ•เบฑเบก;
  • C ++ เป„เบ”เป‰เบ‚เบฐเบซเบเบฒเบเบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบšเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบงเบกเป€เบญเบปเบฒเบฅเบฑเบเบชเบฐเบ™เบฐเบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡ C++, เบฅเบงเบกเบ—เบฑเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปเบฅเบฐเบฎเบนเบšเปเบšเบšเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡, เบ›เบฐเป€เบžเบ”เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡, เบ›เบฐเป€เบžเบ”เบœเบปเบ™เบ•เบญเบšเปเบ—เบ™ inference, เบงเบฑเบ”เบ–เบธ, เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เบ•เบปเบงเบ›เบฐเบเบญเบšเปƒเบ™เบ•เบปเบง, เปเบฅเบฐเบญเบทเปˆเบ™เป†.
  • เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ OpenCL, OpenMP เปเบฅเบฐ CUDA เป„เบ”เป‰เบ–เบทเบเบ‚เบฐเบซเบเบฒเบเบญเบญเบ. เบ™เบตเป‰เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบกเป€เบญเบปเบฒเบŸเบฑเบ‡เบŠเบฑเบ™ OpenCL เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบ•เบปเบง (เบ—เบธเบ‡ "-fdeclare-opencl-builtins" เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก), เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ cl_arm_integer_dot_product เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”, เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเป„เบ”เป‰เบ–เบทเบเบ‚เบฐเบซเบเบฒเบ;
  • เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบดเบ”เป„เบ”เป‰เบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡เปเบฅเบฐเป€เบญเบเบฐเบชเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ static เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก. เป€เบžเบตเปˆเบกเบ—เบธเบ‡เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เป‚เบกเบ”เบนเบ™เบ•เบปเบงเบเบงเบ”เบชเบญเบšเบ—เบตเปˆเบกเบตเบขเบนเปˆ เปเบฅเบฐเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš (โ€œ-เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐ-เบ•เบปเบงเบเบงเบ”เบชเบญเบš[-เบ—เบฒเบ‡เป€เบฅเบทเบญเบ]-เบŠเปˆเบงเบเป€เบซเบผเบทเบญโ€, โ€œ-เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐ-เบเบงเบ”เบชเบญเบš[-เบ—เบฒเบ‡เป€เบฅเบทเบญเบ]-เบŠเปˆเบงเบเป€เบซเบผเบทเบญ-เบญเบฑเบ™เบŸเบฒโ€ เปเบฅเบฐ โ€œ-เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐ-เบเบงเบ”เบชเบญเบš[-เบ—เบฒเบ‡เป€เบฅเบทเบญเบ]-เบŠเปˆเบงเบเป€เบซเบผเบทเบญ "-เบœเบนเป‰โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹"โ€‹)โ€‹. เป€เบžเบตเปˆเบกเบ—เบธเบ‡ "-analyzer-wrror" เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ•เบทเบญเบ™เป„เบžเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.
    เป€เบžเบตเปˆเบกเป‚เปเบ”เบเบฒเบ™เบขเบฑเป‰เบ‡เบขเบทเบ™เปƒเปเปˆ:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบ›เบญเบ”เป„เบžเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš buffers;
    • osx.MIGChecker เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบ‚เบญเบ‡ MIG (Mach Interface Generator) เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เป‚เบ—;
    • optin.osx.OSObjectCStyleCast เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบเบฒเบ™เปเบ›เบ‡เบงเบฑเบ”เบ–เบธ XNU libkern เบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡;
    • apiModeling.llvm เบเบฑเบšเบŠเบธเบ”เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบเบงเบ”เบชเบญเบšเปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เป€เบžเบทเปˆเบญเบเบงเบ”เบซเบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™ codebase LLVM;
    • เบฅเบฐเบซเบฑเบ”เบ„เบปเบ‡เบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบงเบฑเบ”เบ–เบธ C++ เบ—เบตเปˆเบšเปเปˆเบฎเบนเป‰เบˆเบฑเบ (UninitializedObject เปƒเบ™เบŠเบธเบ” optin.cplusplus);
  • เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบฎเบนเบšเปเบšเบš clang เป„เบ”เป‰เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบˆเบฑเบ”เบฎเบนเบšเปเบšเบšเบฅเบฐเบซเบฑเบ”เปƒเบ™เบžเบฒเบชเบฒ C# เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบฎเบนเบšเปเบšเบšเบเบฒเบ™เบˆเบฑเบ”เบฎเบนเบšเปเบšเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบ Microsoft;
  • clang-cl, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบเบฑเบš compiler cl.exe เบฅเบงเบกเบขเบนเปˆเปƒเบ™ Visual Studio, เป„เบ”เป‰เป€เบžเบตเปˆเบก heuristics เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เปเปˆเป„เบŸเบฅเปŒเบ—เบตเปˆเบšเปเปˆเบกเบตเบขเบนเปˆเป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เปเบฅเบฐเบชเบฐเปเบ”เบ‡เบ„เปเบฒเป€เบ•เบทเบญเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™: เป€เบกเบทเปˆเบญเปเบฅเปˆเบ™ "clang-cl / diagnostic :caret /c test.cc");
  • เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเปƒเบซเบกเปˆเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™ linter clang-tidy, เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเบฐเป€เบžเบฒเบฐเบเบฑเบš OpenMP API;
  • เบ‚เบฐเบซเบเบฒเบ เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ clangd (Clang Server), เปƒเบ™เบ—เบตเปˆเบฎเบนเบšเปเบšเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบžเบทเป‰เบ™เบซเบฅเบฑเบ‡เปเบกเปˆเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก (เบเบฒเบ™เบ”เบถเบ‡เบ•เบปเบงเปเบ›, เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ„เปเบฒเบ™เบดเบเบฒเบกเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบฅเบฐเบกเบฐเบซเบฒเบžเบฒเบ, เบเบฒเบ™เบ›เปˆเบฝเบ™เบชเบฒเบเบ—เบตเปˆเบซเบ™เบตเป„เบ›เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ›เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบซเบ™เบต), เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡ เบเบฒเบ™เป€เบ•เบทเบญเบ™เป„เบžเบˆเบฒเบ Clang-tidy, เบ‚เบฐเบซเบเบฒเบเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป„เบŸเบฅเปŒ header เปเบฅเบฐเป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบฅเปเบฒเบ”เบฑเบšเบŠเบฑเป‰เบ™;

เบ•เบปเป‰เบ™โ€‹เบ•เป เบ™เบฐเบงเบฑเบ”เบ•เบฐเบเปเบฒ LLVM 9.0:

  • เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™เปเบšเบšเบ—เบปเบ”เบฅเบญเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ LLD, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบซเบผเบฒเบเบžเบฒเบเบชเปˆเบงเบ™, เปเบ•เปˆเบฅเบฐเบชเปˆเบงเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ ELF เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เบชเปˆเบงเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™, เป€เบŠเบดเปˆเบ‡เบˆเบฐเป‚เบซเบฅเบ”เบญเบปเบ‡เบ›เบฐเบเบญเบšเบญเบทเปˆเบ™เป†เบ•เบฒเบกเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบเบเบ•เบปเบงเป€เบšเบดเปˆเบ‡ PDF เบ—เบตเปˆเบกเบตเปƒเบ™เบ•เบปเบงเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเป‚เบซเบฅเบ”เบžเบฝเบ‡เปเบ•เปˆเป€เบกเบทเปˆเบญเบœเบนเป‰เปƒเบŠเป‰เป€เบ›เบตเบ” PDF เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เป„เบŸเบฅเปŒ).

    เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ LLD เป„เบ”เป‰เบ™เปเบฒเป€เบญเบปเบฒเป„เบ›เบเปˆเบญเบ™ เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡ Linux kernel เบชเปเบฒเบฅเบฑเบš 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, เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” std::is_unbounded_array เปเบฅเบฐ std::is_bounded_array เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเปเบฅเป‰เบง. , std เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบ–เบทเบเบ‚เบฐเบซเบเบฒเบเบญเบญเบ: :atomic. เบเบฒเบ™โ€‹เบชเบฐโ€‹เบซเบ™เบฑเบšโ€‹เบชเบฐโ€‹เบซเบ™เบนเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบš GCC 4.9 เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบขเบธเบ”โ€‹เป€เบŠเบปเบฒโ€‹เบเบฒเบ™ (เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบเบฑเบš GCC 5.1 เปเบฅเบฐโ€‹เบญเบญเบโ€‹เปƒเบซเบกเปˆโ€‹เบเบงเปˆเบฒโ€‹)โ€‹. เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ WASI (WebAssembly System Interface, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ WebAssembly เบžเบฒเบเบ™เบญเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš);
  • เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปƒเบซเบกเปˆเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก. เป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบ›เปˆเบฝเบ™เบเบฒเบ™เป‚เบ— memcmp เป€เบ›เบฑเบ™ bcmp เปƒเบ™เบšเบฒเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเบฐเป€เบงเบฑเป‰เบ™เบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเป„เบฅเบเบฐเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ•เบฑเป‰เบ™เป„เบ›เบซเบฒเบ—เบตเปˆเบ•เบฑเบ™เบชเบฐเบซเบผเบฑเบšเบ•เปˆเปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบซเบฒเป„เบ”เป‰เบซเบผเบทเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบกเบตเบ›เบฐเป€เบžเบ” void;
  • backend เบชเปเบฒเบฅเบฑเบšเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ RISC-V เป„เบ”เป‰เบ–เบทเบเบชเบฐเบ–เบฝเบ™เบฅเบฐเบžเบฒเบš, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเป„เบ”เป‰เบขเบนเปˆเปƒเบ™เบ•เปเบฒเปเบซเบ™เปˆเบ‡เบ—เบปเบ”เบฅเบญเบ‡เบญเบตเบเบ•เปเปˆเป„เบ›เปเบฅเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบŠเบธเบ”เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ RV32I เปเบฅเบฐ RV64I เบ—เบตเปˆเบกเบตเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ MAFDC;
  • เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบซเบผเบฒเบเบขเปˆเบฒเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบฎเบฑเบ”เบเบฑเบš backends เบชเปเบฒเบฅเบฑเบš X86, AArch64, ARM, SystemZ, MIPS, AMDGPU เปเบฅเบฐเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐ PowerPC. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเปเบฒเบฅเบฑเบšเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐ
    AArch64 เป„เบ”เป‰เป€เบžเบตเปˆเบกเบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบš SVE2 (Scalable Vector Extension 2) เปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ MTE (Memory Tagging Extensions); เปƒเบ™ backend ARM, เบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบšเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ Armv8.1-M เปเบฅเบฐเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ MVE (M-Profile Vector Extension) เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก. เบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบšเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเบณ GFX10 (Navi) เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆ backend เบ‚เบญเบ‡ AMDGPU, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™เปเบกเปˆเบ™เป€เบ›เบตเบ”เปƒเบซเป‰เปƒเบŠเป‰เบ‡เบฒเบ™เบ•เบฒเบกเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบฅเบฐ pass เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เบ‡เบฒเบ™. เบœเบ‚ (Data-Parallel Primitives).

  • เบ•เบญเบ™เบ™เบตเป‰เบ•เบปเบงเบ”เบตเบšเบฑเบ LLDB เบกเบตเบเบฒเบ™เป€เบ™เบฑเป‰เบ™เบชเบตเบชเปเบฒเบฅเบฑเบš backtraces เปเบฅเบฐเป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบš DWARF4 debug_types เปเบฅเบฐ DWARF5 debug_info blocks;
  • เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบงเบฑเบ”เบ–เบธเปเบฅเบฐเป„เบŸเบฅเปŒเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบฎเบนเบšเปเบšเบš COFF เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™ llvm-objcopy เปเบฅเบฐ llvm-strip utilities.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: opennet.ru

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™