12.0๊ฐ์๊ฐ์ ๊ฐ๋ฐ ๋์ LLVM XNUMX ํ๋ก์ ํธ์ ์ถ์๊ฐ ๋ฐํ๋์์ต๋๋ค. ์ด๋ ํ๋ก๊ทธ๋จ์ RISC์ ๊ฐ์ ๊ฐ์ ๋ช ๋ น์ด์ ์ค๊ฐ ๋นํธ์ฝ๋(๋ฎ์ ์์ค์ ๊ฐ์ ๋จธ์ )๋ก ์ปดํ์ผํ๋ GCC ํธํ ํดํท(์ปดํ์ผ๋ฌ, ์ตํฐ๋ง์ด์ ๋ฐ ์ฝ๋ ์์ฑ๊ธฐ)์ ๋๋ค. ๋ค๋จ๊ณ ์ต์ ํ ์์คํ ). ์์ฑ๋ ์์ฌ์ฝ๋๋ JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์ ์ง์ ๊ธฐ๊ณ์ด ๋ช ๋ น์ด๋ก ๋ณํ๋ ์ ์์ต๋๋ค.
Clang 12.0์ ๊ฐ์ ์ฌํญ:
- C++20 ํ์ค์์ ์ ์๋ "likely" ๋ฐ "unlikely" ์์ฑ์ ๋ํ ์ง์์ด ๊ตฌํ๋์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์กฐ๊ฑด๋ถ ๊ตฌ๋ฌธ์ด ํธ๋ฆฌ๊ฑฐ๋ ํ๋ฅ ์ ๋ํด ์ต์ ํ ํ๋ก๊ทธ๋จ์ ์๋ฆด ์ ์์ต๋๋ค(์: "[[likely ]] if (์์ > 0) {โ).
- AMD Zen 3(-march=znver3), Intel Alder Lake(-march=alderlake) ๋ฐ Intel Sapphire Rapids(-march=sapphirerapids) ํ๋ก์ธ์์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- x86-64 ์ํคํ ์ฒ ์์ค์ ์ ํํ๊ธฐ ์ํ "-march=x234-86-v[64]" ํ๋๊ทธ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค(v2 - SSE4.2, SSSE3, POPCNT ๋ฐ CMPXCHG16B ํ์ฅ ํฌํจ, v3 - AVX2 ๋ฐ MOVBE, v4 - AVX-512 ) .
- Arm Cortex-A78C(cortex-a78c), Arm Cortex-R82(cortex-r82), Arm Neoverse V1(neoverse-v1), Arm Neoverse N2(neoverse-n2) ๋ฐ Fujitsu A64FX(a64fx) ํ๋ก์ธ์์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด Neoverse-V1 CPU์ ๋ํ ์ต์ ํ๋ฅผ ํ์ฑํํ๋ ค๋ฉด "-mcpu=neoverse-v1"์ ์ง์ ํ ์ ์์ต๋๋ค.
- AArch64 ์ํคํ ์ฒ์ ๊ฒฝ์ฐ "__aarch64_cas8_relax"์ ๊ฐ์ ์์์ฑ ์์ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ๊ธฐ ์ํด ์๋ก์ด ์ปดํ์ผ๋ฌ ํ๋๊ทธ "-moutline-atomics" ๋ฐ "-mno-outline-atomics"๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ LSE(Large System Extensions) ์ง์์ด ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ๋ฐํ์์ ๊ฐ์งํ๊ณ ์ ๊ณต๋ ์์ ํ๋ก์ธ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋๊ธฐํ๋ฅผ ์ํด LL/SC(Load-link/store-conditional) ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋๋ก ๋์ฒดํฉ๋๋ค.
- ์ด์ ๋ง์ปค ๋ฐ ์ด์ ๋ธ๋ฌ ๋์๊ณผ์ ํธํ์ฑ์ ์ํด binutils ์ ํ๊ตฐ์ ๋์ ๋ฒ์ ์ ์ ํํ๋ "-fbinutils-version" ์ต์ ์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ELF ์คํ ํ์ผ์ ๊ฒฝ์ฐ "-gz" ํ๋๊ทธ๊ฐ ์ง์ ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก zlib ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ฒ๊น ์ ๋ณด ์์ถ์ด ํ์ฑํ๋ฉ๋๋ค(gz=zlib). ๊ฒฐ๊ณผ ๊ฐ์ฒด ํ์ผ์ ์ฐ๊ฒฐํ๋ ค๋ฉด lld ๋๋ GNU binutils 2.26+๊ฐ ํ์ํฉ๋๋ค. ์ด์ ๋ฒ์ ์ binutils์์ ํธํ์ฑ์ ๋ณต์ํ๋ ค๋ฉด "-gz=zlib-gnu"๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
- ์ด์ 'this' ํฌ์ธํฐ๋ null์ด ์๋ ์ญ์ฐธ์กฐ(N) ๊ฒ์ฌ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. NULL ๊ฐ์ ์ฌ์ฉํด์ผ ํ ๋ null์ด ์๋ ์์ฑ์ ์ ๊ฑฐํ๋ ค๋ฉด "-fdelete-null-pointer-checks" ์ต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Linux ํ๋ซํผ์์๋ GCC์ ๊ฐ์ด ํด์ ํธ์ถ ํ ์ด๋ธ์ ์์ฑํ๊ธฐ ์ํด AArch64 ๋ฐ PowerPC ์ํคํ ์ฒ์ ๋ํด "-fasynchronous-unwind-tables" ๋ชจ๋๊ฐ ํ์ฑํ๋ฉ๋๋ค.
- "#pragma clang loop vectorize_width"์๋ ๋ฒกํฐํ ๋ฐฉ๋ฒ์ ์ ํํ๊ธฐ ์ํด "๊ณ ์ "(๊ธฐ๋ณธ๊ฐ) ๋ฐ "ํ์ฅ ๊ฐ๋ฅ" ์ต์ ์ ์ง์ ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ๋ฒกํฐ ๊ธธ์ด์ ๋ฌด๊ดํ "ํ์ฅ ๊ฐ๋ฅ" ๋ชจ๋๋ ์คํ์ ์ด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ๋ฒกํฐํ๋ฅผ ์ง์ํ๋ ํ๋์จ์ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Windows ํ๋ซํผ์ ๋ํ ์ง์ ๊ฐ์ : Clang ์ปดํ์ผ๋ฌ, LLD ๋ง์ปค ๋ฐ ์ปดํ์ผ๋ฌ-rt ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ์ฌ Arm64 ์์คํ ์ Windows์ฉ ๊ณต์ ๋ฐ์ด๋๋ฆฌ ์ด์ ๋ธ๋ฆฌ๊ฐ ์ค๋น๋์์ต๋๋ค. MinGW ๋์ ํ๋ซํผ์ฉ์ผ๋ก ๋น๋ํ ๋ ํฌ๋ก์ค ์ปดํ์ผ ์์๋ .exe ์ ๋ฏธ์ฌ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
- OpenCL, OpenMP ๋ฐ CUDA ์ง์๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ด ํ์ฅ๋์์ต๋๋ค. OpenCL 3.0 ๋ฐ OpenCL 1.0์ ๋ํ ๋งคํฌ๋ก ์ต์ ์ ์ ํํ๊ธฐ ์ํด "-cl-std=CL3.0" ๋ฐ "-cl-std=CL1.0" ์ต์ ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ง๋จ ๋๊ตฌ๊ฐ ํ์ฅ๋์์ต๋๋ค.
- ์ผ๋ถ x86 ๊ธฐ๋ฐ ํ๋ก์ธ์์ ๊ตฌํ๋ HRESET, UINTR ๋ฐ AVXVNNI ๋ช ๋ น์ด์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- x86 ์์คํ ์์๋ "-mtune=" ์ต์ ์ง์์ด ํ์ฑํ๋ฉ๋๋ค. " -march= ๊ฐ์ ๊ด๊ณ์์ด ์ ํํ ๋ง์ดํฌ๋ก์ํคํ ์ฒ ์ต์ ํ๋ฅผ ํ์ฑํํฉ๋๋ค. "
- ์ ์ ๋ถ์๊ธฐ๋ ์ผ๋ถ POSIX ํจ์์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ์ผ๋ฉฐ ๋น๊ต์ ์ฌ๋ฌ ๊ธฐํธ ๊ฐ์ด ์์ ๋ ์กฐ๊ฑด๋ถ ์ฐ์ฐ ๊ฒฐ๊ณผ ๊ฒฐ์ ์ ํฌ๊ฒ ๊ฐ์ ํ์ต๋๋ค. ์๋ก์ด ๊ฒ์ฌ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค: fuchia.HandleChecker(๊ตฌ์กฐ์ ํธ๋ค ์ ์), webkit.UncountedLambdaCapturesChecker webkit ๋ฐ alpha.webkit.UncountedLocalVarsChecker(WebKit ์์ง ์ฝ๋์์ ํฌ์ธํฐ ์์ ์ ํน์ฑ์ ๊ณ ๋ ค).
- ์์์ ๋งฅ๋ฝ์์ ์ฌ์ฉ๋๋ ํํ์์์๋ ๋ด์ฅ ํจ์ __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64 ๋ฑ์ ์ฌ์ฉ์ด ํ์ฉ๋ฉ๋๋ค. .__bswapq , _castf*, __rol* ๋ฐ __ror*.
- ์๋ณ์, ์ด ๋ฐ ํ๋ ์ ์ ์ฃผ์์ ๊ฐ๊ฒฉ์ ์ ํํ๊ธฐ ์ํด clang-format ์ ํธ๋ฆฌํฐ์ BitFieldColonSpacing ์ต์ ์ ์ถ๊ฐํ์ต๋๋ค.
- Linux ํ๋ซํผ์ clangd ์บ์ฑ ์๋ฒ(Clang Server)๋ ์ฅ๊ธฐ๊ฐ ์์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ํฌ๊ฒ ์ค์์ต๋๋ค(์ด์ ์ฒด์ ์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ๋ฐํํ๊ธฐ ์ํด malloc_trim์ ๋ํ ์ฃผ๊ธฐ์ ์ธ ํธ์ถ์ด ์ ๊ณต๋จ).
LLVM 12.0์ ์ฃผ์ ํ์ ์ฌํญ:
- Python์ผ๋ก ์์ฑ๋ llvm-build ๋น๋ ๋๊ตฌ์ ๋ํ ์ง์์ด ์ค๋จ๋์์ผ๋ฉฐ, ๋์ ํ๋ก์ ํธ๊ฐ CMake ๋น๋ ์์คํ ์ ์ฌ์ฉํ๋๋ก ์์ ํ ์ ํ๋์์ต๋๋ค.
- AArch64 ์ํคํ ์ฒ์ ๋ฐฑ์๋์์ Windows ํ๋ซํผ์ ๋ํ ์ง์์ด ๊ฐ์ ๋์์ต๋๋ค. ๋์ Windows ์์คํ ์ ๋ํ ์ด์ ๋ธ๋ฌ ์ถ๋ ฅ์ ์ฌ๋ฐ๋ฅธ ์์ฑ์ด ๋ณด์ฅ๋๊ณ ํด์ ํธ์ถ์ ๋ํ ๋ฐ์ดํฐ ์์ฑ์ด ์ต์ ํ๋์์ต๋๋ค(์ด๋ฌํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ 60์ผ๋ก ์ค์์ต๋๋ค). %), ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ด .seh_* ์ง์๋ฌธ์ ์ถ๊ฐ๋์์ต๋๋ค.
- PowerPC ์ํคํ ์ฒ์ ๋ฐฑ์๋๋ ๋ฃจํ ๋ฐ ์ธ๋ผ์ธ ๋ฐฐํฌ๋ฅผ ์ํ ์๋ก์ด ์ต์ ํ, Power10 ํ๋ก์ธ์์ ๋ํ ํ์ฅ๋ ์ง์, ๋งคํธ๋ฆญ์ค ์กฐ์์ ์ํ MMA ๋ช ๋ น์ ๋ํ ์ง์ ์ถ๊ฐ, AIX ์ด์ ์ฒด์ ์ ๋ํ ํฅ์๋ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- x86 ๋ฐฑ์๋๋ AMD Zen 3, Intel Alder Lake ๋ฐ Intel Sapphire Rapids ํ๋ก์ธ์๋ ๋ฌผ๋ก HRESET, UINTR ๋ฐ AVXVNNI ํ๋ก์ธ์ ์ง์นจ์ ๋ํ ์ง์์ ์ถ๊ฐํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๊ณ๊ฐ ๋ ์ด์ ์ง์๋์ง ์๋์ง ํ์ธํ๊ธฐ ์ํด ํฌ์ธํฐ๋ฅผ ๊ฒ์ฌํ๋ MPX(Memory Protection Extensions) ์ง์(์ด ๊ธฐ์ ์ ๋๋ฆฌ ๋ณด๊ธ๋์ง ์์์ผ๋ฉฐ ์ด๋ฏธ GCC ๋ฐ clang์์ ์ ๊ฑฐ๋์์ต๋๋ค). ํผ์ฐ์ฐ์ ์คํ์ ๋ฐ ์ ํ์ ํฌ๊ธฐ๋ฅผ ์ ์ดํ๊ธฐ ์ํด {disp32} ๋ฐ {disp8} ์ ๋์ฌ ๋ฐ .d32 ๋ฐ .d8 ์ ๋ฏธ์ฌ์ ๋ํ ์ง์์ ์ด์ ๋ธ๋ฌ์ ์ถ๊ฐํ์ต๋๋ค. ๋ง์ดํฌ๋ก์ํคํ ์ฒ ์ต์ ํ ํฌํจ์ ์ ์ดํ๊ธฐ ์ํด ์๋ก์ด ์์ฑ "tune-cpu"๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
- ์๋ก์ด ๋ชจ๋ "-fsanitize=unsigned-shift-base"๊ฐ ์ ์ ๋ฌธ์ ๊ฐ์ง๊ธฐ(integer sanitizer, "-fsanitize=integer")์ ์ถ๊ฐ๋์ด ์ผ์ชฝ์ผ๋ก ๋นํธ ์ด๋ ํ ๋ถํธ ์๋ ์ ์์ ์ค๋ฒํ๋ก๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ๋ค์ํ ๊ฐ์ง๊ธฐ(asan, cfi, lsan, msan, tsan, ubsan sanitizer)์ ํ์ค Musl ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋ Linux ๋ฐฐํฌํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- LLD ๋ง์ปค์ ๊ธฐ๋ฅ์ด ํ์ฅ๋์์ต๋๋ค. ์ถ๊ฐ๋ ์ต์ "--dependent-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program"์ ํฌํจํ์ฌ ELF ํ์์ ๋ํ ์ง์์ด ํฅ์๋์์ต๋๋ค. -๊ฐ์์ฑโ " MinGW ์ง์์ด ํฅ์๋์์ต๋๋ค. Mach-O ํ์(macOS)์ ๊ฒฝ์ฐ arm64, arm ๋ฐ i386 ์ํคํ ์ฒ, LTO(๋งํฌ ์๊ฐ ์ต์ ํ) ๋ฐ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํ ์คํ ํด์ ์ ๋ํ ์ง์์ด ๊ตฌํ๋์์ต๋๋ค.
- Libc++๋ C++20 ํ์ค์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ C++2b ์ฌ์์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์์ํ์ต๋๋ค. ํ์งํ ์ง์ ๋นํ์ฑํ(โ-DLIBCXX_ENABLE_LOCALIZATION=OFFโ) ๋ฐ ์์ฌ ๋์ ์์ฑ ์ฅ์น(โ-DLIBCXX_ENABLE_RANDOM_DEVICE=OFFโ)๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ํ๊ธฐ ์ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
์ถ์ฒ : opennet.ru