XNUMXãæã®éçºæéãçµãŠ
LLVM 10.0 ã®æ°æ©èœã«ã¯ãC++ æŠå¿µã®ãµããŒããClang ãå¥ã®ããã»ã¹ãšããŠå®è¡ãããªããªã£ãããšãWindows ã® CFG (ã³ã³ãããŒã« ãã㌠ã¬ãŒã) ãã§ãã¯ã®ãµããŒããæ°ãã CPU æ©èœã®ãµããŒããå«ãŸããŸãã
- ããã®ãµããŒããè¿œå ããŸããã
æŠå¿µ ããã¯ãã³ãŒãå C++2a (-std=c++2a ãã©ã°ã«ãã£ãŠæå¹) ãšãã次ã®æšæºã«å«ãŸãã C++ ãã³ãã¬ãŒãæ¡åŒµæ©èœã§ãã
æŠå¿µã䜿çšãããšãã³ã³ãã€ã«æã«ãã³ãã¬ãŒã ãã©ã¡ãŒã¿ãŒãšããŠåãå ¥ããããåŒæ°ã®ã»ãããå¶éããäžé£ã®ãã³ãã¬ãŒã ãã©ã¡ãŒã¿ãŒèŠä»¶ãå®çŸ©ã§ããŸãããã®æŠå¿µã䜿çšãããšããã³ãã¬ãŒãå ã§äœ¿çšãããããŒã¿åã®ããããã£ãšå ¥åãã©ã¡ãŒã¿ãŒã®ããŒã¿åããããã£ã®éã®è«ççäžäžèŽãåé¿ã§ããŸãããã³ãã¬ãŒã
æŠå¿µ EqualityComparable = require(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - ããã©ã«ãã§ã¯ãã³ã³ãã€ã«ãå®è¡ããå¥ã®ããã»ã¹ (ãclang -cc1ã) ã®èµ·åã¯åæ¢ãããŸããã³ã³ãã€ã«ã¯ã¡ã€ã³ããã»ã¹ã§è¡ãããããã«ãªããã-fno-integrated-cc1ããªãã·ã§ã³ã䜿çšããŠå€ãåäœã埩å ã§ããããã«ãªããŸããã
- æ°ãã蚺æã¢ãŒã:
- ã-Wc99-designatorãããã³ã-Wreorder-init-listãã¯ãC99 ã§ã¯æ£ãããŠã C++99 ã§ã¯æ£ãããªãå ŽåãC++ ã¢ãŒã㧠C20 ã€ãã·ã£ã©ã€ã¶ã䜿çšããããšã«å¯ŸããŠèŠåããŸãã
- ã-Wsizeof-array-divã - ãint arr[10];ããªã©ã®ç¶æ³ãææããŸãã âŠsizeof(arr) / sizeof(short)âŠã (ãsizeof(arr) / sizeof(int)ãã§ããå¿ èŠããããŸã)ã
- ã-Wxor-used-as-poã - çŽ¯ä¹ (2^16) ãšæ··åãããå¯èœæ§ã®ããæŒç®ã§ã®ã^ã (xor) æŒç®åã®äœ¿çšãªã©ã®æ§æäœã®äœ¿çšã«å¯ŸããŠèŠåããŸãã
- ã-Wfinal-dtor-non-final-classã - ãfinalãæå®åã§ããŒã¯ãããŠããªããããfinalãå±æ§ãæã€ãã¹ãã©ã¯ã¿ãŒãæã€ã¯ã©ã¹ã«ã€ããŠèŠåããŸãã
- ã-Wtautological-bitwise-compareãã¯ããããåäœã®æŒç®ãšå®æ°ã®éã®ããŒãããžãŒæ¯èŒã蚺æãããããåäœã® OR æŒç®ãéè² æ°ã«é©çšãããåžžã«çã®æ¯èŒãèå¥ããããã®èŠåã®ã°ã«ãŒãã§ãã
- ã-Wbitwise-conditional-parthesesãã¯ãè«çæŒç®å AND (&) ããã³ OR (|) ãšæ¡ä»¶æŒç®å (?:) ãæ··åããå Žåã®åé¡ãèŠåããŸãã
- ã-Wmisleading-indentationãã¯ãGCC ã®ååã®ãã§ãã¯ã«é¡äŒŒããŠãããã€ã³ãã³ããããåŒã«ã€ããŠããããã if/else/for/while ãããã¯ã®äžéšã§ãããã®ããã«èŠåããŸãããå®éã«ã¯ããããã®åŒã¯ãã®ãããã¯ã«ã¯å«ãŸããŠããŸããã ã
- ã-Wextraããæå®ãããšãã-Wdeprecated-copyããã§ãã¯ãæå¹ã«ãªããã³ã³ã¹ãã©ã¯ã¿ãŒã®äœ¿çšã«ã€ããŠèŠåããŸãã
æ瀺çãªãã¹ãã©ã¯ã¿ãŒå®çŸ©ãæã€ã¯ã©ã¹ã§ã®ãmoveããšãcopyãã - ã-Wtautological-overlap-compareããã-Wsizeof-pointer-divããã-Wtautological-compareããã-Wrange-loop-analysisããã§ãã¯ãæ¡åŒµãããŸããã
- ã-Wbitwise-op-parenthesesãããã³ã-Wlogical-op-parhesesããã§ãã¯ã¯ããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠããŸãã
- C ããã³ C++ ã³ãŒãã§ã¯ããã€ã³ã¿ãŒç®è¡æŒç®ã¯é åå ã§ã®ã¿èš±å¯ãããŸãã ã-fsanitize=pointer-overflowãã¢ãŒãã®æªå®çŸ©åäœãµãã¿ã€ã¶ãŒã¯ãnull ãã€ã³ã¿ãŒã«ãŒã以å€ã®ãªãã»ãããè¿œå ããå Žåããnull 以å€ã®ãã€ã³ã¿ãŒããæŽæ°ãæžç®ãããšãã« null ãã€ã³ã¿ãŒãäœæããå Žåãªã©ã®ã±ãŒã¹ãæ€åºããããã«ãªããŸããã
- ã-fsanitize=implicit-conversionãïŒæé»çå€æãµãã¿ã€ã¶ãŒïŒã¢ãŒãã¯ããintãåãããããã ãµã€ãºãå°ããåã®ã€ã³ã¯ãªã¡ã³ãããã³ãã¯ãªã¡ã³ãæäœã®åé¡ãèå¥ããããã«é©åãããŠããŸãã
- x86 ã¿ãŒã²ãã ã¢ãŒããã¯ãã£ã-march=skylake-avx512ããã-march=icelake-clientããã-march=icelake-serverããã-march=cascadelakeããããã³ã-march=cooperlakeãããã¯ãã«åãããããã©ã«ãã§éžæããå Žåãã³ãŒãã¯ããœãŒã¹ ã³ãŒãå ã§ã®çŽæ¥ã®æ瀺ãé€ãã512 ããã zmm ã¬ãžã¹ã¿ã®äœ¿çšãåæ¢ããŸããããã®çç±ã¯ã512 ãããæäœãå®è¡ãããš CPU åšæ³¢æ°ãäœäžããå šäœçãªããã©ãŒãã³ã¹ã«æªåœ±é¿ãåãŒãå¯èœæ§ãããããã§ããæ°ããåäœãå€æŽããããã«ããªãã·ã§ã³ã-mprefer-vector-width=512ããæäŸãããŠããŸãã
- ã-flax-vector-conversionsããã©ã°ã®åäœã¯ GCC ãšäŒŒãŠãããæŽæ°ãã¯ãã«ãšæµ®åå°æ°ç¹ãã¯ãã«éã®æé»çãªãã¯ãã« ãããå€æã¯çŠæ¢ãããŠããŸãããã®å¶éãæé€ããã«ã¯ããã©ã°ã䜿çšããããšãææ¡ãããŠããŸãã
ã-flax-vector-conversions=allããããã©ã«ãã§ãã - Octeon ãã¡ããªã® MIPS CPU ã®ãµããŒããåäžããŸãããæå¹ãª CPU ã¿ã€ãã®ãªã¹ãã«ãocteon+ããè¿œå ããŸããã
- WebAssembly äžéã³ãŒãã«ã¢ã»ã³ãã«ãããšãã«ãã·ã¹ãã ã§å©çšå¯èœãªå Žå㯠wasm-opt ãªããã£ãã€ã¶ãŒãèªåçã«åŒã³åºãããŸãã
- RISC-V ã¢ãŒããã¯ãã£ã«åºã¥ãã·ã¹ãã ã®å Žåãã¢ã»ã³ãã©ã®ã€ã³ã©ã€ã³æ¿å ¥ã®æ¡ä»¶ä»ããããã¯ã§æµ®åå°æ°ç¹å€ãæ ŒçŽããã¬ãžã¹ã¿ã®äœ¿çšãèš±å¯ãããŸãã
- æ°ããã³ã³ãã€ã© ãã©ã°ãè¿œå ããŸãããã__GNUC__ãããã³åæ§ã®ãã¯ãã®ããŒãžã§ã³å€ãèšå®ããã-fgnuc-versionãã ã-fmacro-prefix-map=OLD=NEWãã¯ãã__FILE__ããªã©ã®ãã¯ãå
ã®ãã£ã¬ã¯ããªæ¥é èŸ OLD ã NEW ã«çœ®ãæããŸãã ã-fpatchable-function-entry=N[,M]ãã¯ãé¢æ°ãšã³ã㪠ãã€ã³ãã®ååŸã«äžå®æ°ã® NOP åœä»€ãçæããŸãã RISC-Vã®å Žå
ã-ffixed-xXããã-mcmodel=medanyããããã³ã-mcmodel=medlowããã©ã°ã®ãµããŒããè¿œå ãããŸããã - â__attribute__((target(âbranch-protection=...â))) å±æ§ã®ãµããŒããè¿œå ãããŸããããã®å¹æã¯ãªãã·ã§ã³ãšåæ§ã§ã
-mbranch-protection . - Windows ãã©ãããã©ãŒã ã§ã¯ãã-cfguardããã©ã°ãæå®ãããšãéæ¥çãªé¢æ°åŒã³åºãã«å¯Ÿããå®è¡ãããŒæŽåæ§ãã§ã㯠(ã³ã³ãããŒã« ãã㌠ã¬ãŒã) ã®çœ®æãå®è£ ãããŸãããã§ãã¯çœ®æãç¡å¹ã«ããã«ã¯ãã-cfguard-nochecksããã©ã°ãŸãã¯ã__declspec(guard(nocf))ã修食åã䜿çšã§ããŸãã
- gnu_inline å±æ§ã®åäœã¯ããexternãããŒã¯ãŒããªãã§äœ¿çšãããå Žåã® GCC ãšåæ§ã§ãã
- OpenCL ããã³ CUDA ãµããŒãã«é¢é£ããæ©èœãæ¡åŒµãããŸãããæ°ãã OpenMP 5.0 æ©èœã®ãµããŒããè¿œå ãããŸããã
- Clang-format ãŠãŒãã£ãªãã£ã«æšæºãªãã·ã§ã³ãè¿œå ãããŸãããããã«ãããã³ãŒãã®è§£æããã³ãã©ãŒãããæã«äœ¿çšããã C++ æšæºã®ããŒãžã§ã³ (ææ°ãèªåãc++03ãc++11ãc++14ã c++17ãc++20)ã
- æ°ãããã§ãã¯ãéçã¢ãã©ã€ã¶ãŒã«è¿œå ãããŸãã: ååãªã¹ãã¬ãŒãžé åããããã©ãããå€æãã alpha.cplusplus.PlacementNewãFuchsia ãã³ãã©ãŒã«é¢é£ãããªãŒã¯ãæ€åºãã fuchsia.HandleCheckerã[NSCoder decodeValueOfObjCType ã®äœ¿çšæã«æœåšçãªãããã¡ ãªãŒããŒãããŒãæ€åºãã security.insecureAPI.decodeValueOfObjCType] ïŒã§ïŒ] ã
- æªå®çŸ©åäœãµãã¿ã€ã¶ãŒ (UBSan) ã¯ããã€ã³ã¿ãŒ ãªãŒããŒãã㌠ãã§ãã¯ãæ¡åŒµããŠãNULL ãã€ã³ã¿ãŒãžã®éãŒã ãªãã»ããã®é©çšããŸãã¯çµæãšããŠçãã NULL ãã€ã³ã¿ãŒ ãªãã»ããã®è¿œå ããã£ããã§ããããã«ããŸããã
- ãªã³ã¿ãŒã§ã«ãã£ã«ãã£ãšæŽé
è¿œå ãã æ°ããå°åæã®å€§éšåã
ã¡ã€ã³
- ãã¬ãŒã ã¯ãŒã¯ãž
å±æ§ æ°ããããã·ãŒãžã£éã®æé©åãšã¢ãã©ã€ã¶ãŒãè¿œå ãããŸããã 19 åã® LLVM IR ãšæŽ»æ§ãªã©ã® 12 åã®æœè±¡å±æ§ãå«ãã12 åã®ç°ãªãå±æ§ã®ç¶æ ãäºæž¬ãããŸãã - ã³ã³ãã€ã©ã«çµã¿èŸŒãŸããæ°ããè¡åæ°åŠé¢æ°ãè¿œå ããŸãã (
çµã¿èŸŒã¿é¢æ° )ãã³ã³ãã€ã«äžã«å¹ççãªãã¯ãã«åœä»€ã«çœ®ãæããããŸãã - X86ãAArch64ãARMãSystemZãMIPSãAMDGPUãããã³ PowerPC ã¢ãŒããã¯ãã£ã®ããã¯ãšã³ãã«å€æ°ã®æ¹åãå ããããŸããã CPUãµããŒãã®è¿œå
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 ãªããžã§ã¯ã ãã¡ã€ã«ã§ã¯ãè€æ°å€ã®é¢æ°ã·ã°ããã£ã䜿çšã§ããããã«ãªããŸããã
- ã¢ãã©ã€ã¶ãŒã¯ã«ãŒããåŠçãããšãã«äœ¿çšãããŸã
ã¡ã¢ãªSSA ã䜿çšãããšãç°ãªãã¡ã¢ãªæäœéã®äŸåé¢ä¿ãå®çŸ©ã§ããŸãã MemorySSA ã¯ãã³ã³ãã€ã«æéãšå®è¡æéãççž®ããããããã©ãŒãã³ã¹ãæãªãããšãªã AliasSetTracker ã®ä»£ããã«äœ¿çšãããã§ããŸãã - LLDB ãããã¬ãŒã§ã¯ãDWARF v5 圢åŒã®ãµããŒãã倧å¹
ã«åäžããŸããã MinGW ã䜿çšãããã«ãã®ãµããŒãã®æ¹å
ãŸããARM ããã³ ARM64 ã¢ãŒããã¯ãã£çšã® Windows å®è¡å¯èœãã¡ã€ã«ããããã°ããããã®åææ©èœãè¿œå ãããŸããã Tab ããŒãæŒããŠå ¥åããªãŒãã³ã³ããªãŒããããšãã«æäŸããããªãã·ã§ã³ã®èª¬æãè¿œå ããŸããã -
æ¡åŒµããã LLD ãªã³ã«ãŒæ©èœã GNU ãªã³ã«ãŒãšã® glob ãã³ãã¬ãŒãã®å®å šãªäºææ§ã®ç¢ºä¿ãå§çž®ãããã° ã»ã¯ã·ã§ã³ ".zdebug" ã®ãµããŒãã®è¿œå ã.note.gnu.property ã»ã¯ã·ã§ã³ãå®çŸ©ããããã® PT_GNU_PROPERTY ããããã£ã®è¿œå ãªã©ãELF 圢åŒã®ãµããŒããåäžããŸãã (å°æ¥äœ¿çšå¯èœ) Linux ã«ãŒãã«)ã
ã-z no Separate-codeããã-z Separate-codeããããã³ã-z Separate-loadable-segmentsãã¢ãŒããå®è£ ãããŸããã MinGW ãš WebAssembly ã®ãµããŒããæ¹åãããŸããã
åºæïŒ ãªãŒãã³ããã.ru