6๊ฐ์๊ฐ์ ๊ฐ๋ฐ ๋์ LLVM 22.1.0์ด ์ถ์๋์์ต๋๋ค. LLVM์ ํ๋ก๊ทธ๋จ์ RISC์ ์ ์ฌํ ๊ฐ์ ๋ช ๋ น์ด(๋ค๋จ๊ณ ์ต์ ํ ์์คํ ์ ๊ฐ์ถ ์ ์์ค ๊ฐ์ ๋จธ์ )์ ์ค๊ฐ ๋นํธ์ฝ๋๋ก ์ปดํ์ผํ๋ ๋๊ตฌ(์ปดํ์ผ๋ฌ, ์ต์ ํ ๋๊ตฌ, ์ฝ๋ ์์ฑ๊ธฐ)๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. ์์ฑ๋ ์์ฌ ์ฝ๋๋ ํน์ ๋์ ํ๋ซํผ์ฉ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๊ฑฐ๋, JIT(Just-In-Time) ์ปดํ์ผ๋ฌ์์ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ์ง์ ๊ธฐ๊ณ์ด ๋ช ๋ น์ด๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. LLVM ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก, ์ด ํ๋ก์ ํธ๋ C, C++, Objective-C ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ๋ Clang ์ปดํ์ผ๋ฌ๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. 18.x ๋ธ๋์น๋ถํฐ๋ ์๋ก์ด ๋ฒ์ ๋ฒํธ ์ฒด๊ณ๋ฅผ ๋์ ํ์ฌ ๊ฐ๋ฐ ์ค์๋ ๋ฆด๋ฆฌ์ค 0("N.0")์ ์ฌ์ฉํ๊ณ , ์ฒซ ๋ฒ์งธ ์์ ๋ฒ์ ์ "N.1"๋ก ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง๋๋ค.
Clang 22์ ๊ฐ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- `malloc`๊ณผ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ ์ ๊ณ ์ ์๋ณ์๋ฅผ ํ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํ ํฐ(Allocation Tokens) ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ํ ๋น ํ ํฐ์ ์ฌ์ฉํ๋ฉด ํ ์ ๋ณด๋ฅผ ๊ตฌ์กฐํํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์ง๋ฅผ ๊ฐ์ํํ๋ฉฐ ๋ชฉ์ ์ด๋ ์์ ํจํด์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค(์: ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถ). ์ด ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ค๋ฉด `-fsanitize=alloc-token` ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- C ์ธ์ด ๊ด๋ จ ๊ธฐ๋ฅ:
- "defer" ์ง์ฐ ์คํ ๋ฉ์ปค๋์ฆ์ ์ ์ํ๋ ์ด์ ์ฌ์์ด ๊ตฌํ๋์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ํ์ฌ ์ค์ฝํ๊ฐ ์ข ๋ฃ๋ ๋ ์ก์ ์ ์คํํ ์ ์์ต๋๋ค. "defer" ์ง์์ ํ์ฑํํ๊ธฐ ์ํด "-fdefer-ts" ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- GCC์ ์ ์ฌ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ด์ฅ ํจ์ `__builtin_stack_address()`๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด ํจ์๋ ํ์ฌ ํจ์์ ๊ทธ ์ดํ์ ํธ์ถ๋๋ ํจ์๋ค์ ์คํ ์์ญ์ ๊ตฌ๋ถํ๋ ์คํ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋ฏธ๋ C2y ํ์ค์ ์ํด ๊ฐ๋ฐ ์ค์ธ ๊ธฐ๋ฅ:
- ๋ช ๋ช ๋ ๋ฃจํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฃจํ์ switch ๋ฌธ์ ์ด๋ฆ์ ์ง์ ํ ์ ์์ผ๋ฉฐ, break ๋ฐ continue ๋ฌธ์์ ์ง์ ํ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ข ๋ฃํ ๋ฃจํ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. ์ธ๋ถ ๋ฃจํ: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // CONT1์ผ๋ก ์ด๋ continue outer; // CONT2๋ก ์ด๋ // CONT1 } // CONT2 }
- ๊ณ ์ ์๋ณ์ ์ด๋ฆ์ ์์ฑํ๋๋ก ์ค๊ณ๋ ๋ด์ฅ ๋งคํฌ๋ก "__COUNTER__"์ ๊ตฌํ์ด ํ์ฅ๋์ด ํ์ค์ ํฌํจ๋์์ต๋๋ค. ์ด ๋งคํฌ๋ก ํธ์ถ ํ์๋ 2147483647ํ๋ก ์ ํ๋์ด ์์ผ๋ฉฐ, ์ด ์ ํ์ ์ด๊ณผํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- `extern inline`์ผ๋ก ์ ์ธ๋ ํจ์ ๋ด์์ ์ ์ ํจ์ ๋๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๊ฒฝ๊ณ (-Wstatic-in-inline)๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
- C23 C ํ์ค์ ์ ์๋ ๊ธฐ๋ฅ:
- float.h ํค๋ ํ์ผ์ ์ด์ float, double ๋ฐ long double ์ ํ์ ๋ํด ์ ํธ๋ฅผ ๋ณด๋ด๋(์ฐ์ ์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ ์์ธ๋ฅผ ๋ฐ์์ํค๋) NaN ๊ฐ์ ๊ตฌํํ๋ FLT_SNAN, DBL_SNAN ๋ฐ LDBL_SNAN ๋งคํฌ๋ก๋ฅผ ์ง์ํฉ๋๋ค.
- ํ๋๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ๊ฐ์ ๋ฒ์ญ ๋จ์ ๋ด์์ ์๋ก ๋ค๋ฅธ ์ด๋ฆ ์๋ ์ ํ์ด ํธํ๋๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.
- ์ข ์์ฑ ๊ฒ์ฌ ์ค์ ๋๋ฝ๋ ํค๋ ํ์ผ์ ๋ฌด์ํ๋ ๋ฐ ์ฌ์ฉ๋์๋ "-MG" ํ๋๊ทธ๊ฐ "#embed" ์ง์๋ฌธ์ผ๋ก ํ์ฅ๋์ด ์ด์ "#embed" ์ง์๋ฌธ์ ์ง์ ๋ ํ์ผ์ด ๋๋ฝ๋ ๊ฒฝ์ฐ "ํ์ผ์ ์ฐพ์ ์ ์์" ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํฉ๋๋ค.
- C++ ๊ด๋ จ ๊ธฐ๋ฅ:
- C++2c(C++26) ์ฌ์์์ ๊ฐ๋ฐ๋ "constexpr" ์ปจํ ์คํธ์์ ๊ตฌ์กฐ์ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ฆ, ์์ ํํ์์ ๋ํ ์ฐธ์กฐ ์์ฒด๊ฐ ์ด์ ์์ ํํ์์ด ๋ ์ ์์ต๋๋ค. ๋ฐฐ์ด๊ณผ ๊ฐ๋จํ ๊ตฌ์กฐ์ฒด์ ๋ํ ์ง์์ด ๊ตฌํ๋์์ต๋๋ค(ํํ์ ์์ง ์ง์๋์ง ์์ต๋๋ค). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- C++20 ํ์ค์์ ์๊ตฌํ๋ ๋๋ก, ์ด์ ์ ์ฝ ์กฐ๊ฑด์ ๊ฒ์ฌ ์ ์ ํ์ค ํ์์ผ๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณด๋ค ์ ํํ ์ง๋จ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๊ณ ๊ฐ๋ ID์๋ง ์ฌ์ฉ๋๋ ํ ํ๋ฆฟ ์ธ์์ ์นํ ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋น๊ต ์ฐ์ฐ์ "<", ">", "<=", ">="๊ฐ "<=>" ์ฐ์ฐ์๋ก๋ถํฐ ํฉ์ฑ๋์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ด์ฅ ํจ์ "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship"์ ์ถ๊ฐํ์ต๋๋ค.
- "-Wincompatible-pointer-types" ๋งค๊ฐ๋ณ์๊ฐ ๊ฒฝ๊ณ ๋์ ์ค๋ฅ๋ฅผ ์ถ๋ ฅํ๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ด์ ๋์์ผ๋ก ๋๋๋ฆฌ๋ ค๋ฉด "-Wno-error=incompatible-pointer-types" ์ต์ ์ ์ฌ์ฉํ์ญ์์ค.
- __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter, __builtin_dedup_pack ๋ฑ์ ๋ด์ฅ ํจ์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, builtin_dedup_pack ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ ๋ชฉ๋ก์์ ์ค๋ณต์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. myTypeList = TypeList<__builtin_dedup_pack> โฆ>; // ๊ฒฐ๊ณผ ํ์ ์ TypeList๊ฐ ๋ฉ๋๋ค.
- UBSan(-fsanitize=undefined -fsanitize-trap=undefined)์ ์ฌ์ฉํ์ฌ ์ ์๋์ง ์์ ๋์์ ๋๋ฒ๊น ํ ๋, ์ด์ ์์ฑ๋ ๋๋ฒ๊ทธ ์ ๋ณด์ ์ค๋ฅ ์์ธ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ์ค๋ฅ ์ ๋ณด์ ์์ธ ์์ค์ ์ง์ ํ๋ "-fsanitize-debug-trap-reasons" ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด ํ๋๊ทธ๋ ์ผ๋ฐ์ ์ธ ์ค๋ช (์: "์ ์ ๋ง์ ์ค๋ฒํ๋ก")์ ํ์ํ๋ ค๋ฉด "basic"์ผ๋ก ์ค์ ํ๊ณ , ์์ธํ ์ ๋ณด(์: "'a + b'์์ ๋ถํธ ์๋ ์ ์ ๋ง์ ์ค๋ฒํ๋ก")๋ฅผ ํฌํจํ๋ ค๋ฉด "detailed"๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- ์๋ก์ด ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- "-f[no-]sanitize-debug-trap-reasons" ์ต์ ์ "-fsanitize-trap" ๋ชจ๋๋ก ์ปดํ์ผํ ๋ ์์ธ ํธ๋ฉ ์ด์ ๊ฐ ๋๋ฒ๊ทธ ์ ๋ณด์ ํฌํจ๋ ์ง ์ฌ๋ถ๋ฅผ ์ ์ดํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํ ํฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" ๋ฐ "-fsanitize-alloc-token-extended" ์ต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- "-fmatrix-memory-layout" ์ต์ ์ ํ๋ ฌ ์ ํ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ ์ดํฉ๋๋ค(์: ์ด ์ฐ์ ํ๋ ฌ์ ๊ฒฝ์ฐ column-major, ํ ์ฐ์ ํ๋ ฌ์ ๊ฒฝ์ฐ row-major).
- ์ด์ ํจ์์๋ malloc ์์ฑ๊ณผ ์ ์ฌํ์ง๋ง ํฌ์ธํฐ์ ํฌ๊ธฐ ํ๋ ๋๋ ๋ธ๋ก ๋์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ํฌํจํ๋ ์คํฌํ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์ ์ ์ฉ๋๋ "malloc_span" ์์ฑ์ด ์์ต๋๋ค.
- ๋งํฌ ์์ ์ ํ์ํ printf ํจ์์ ์ ์ ๋งํฌ ๊ตฌํ์ ๋์ ์ผ๋ก ์ ํํ ์ ์๋๋ก "modular_format" ์์ฑ์ ์ถ๊ฐํ์ต๋๋ค.
- ์ง๋จ ๋ฐ ์ ์ ๋ถ์ ๋๊ตฌ๊ฐ ํ์ฅ๋์๊ณ , ์๋ก์ด ๊ฒ์ฌ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค(์ง๋จ ๊ด๋ จ ๊ฐ์ ์ฌํญ ์์ญ ๊ฑด).
- X86 ๋ฐฑ์๋์ SSE, AVX ๋ฐ AVX512 ํ์ฅ ๊ธฐ๋ฅ์ ์ํ ์ถ๊ฐ ๋ด์ฅ ํจ์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. Wildcat Lake(-march=wildcatlake) ๋ฐ Nova Lake(-march=novalake) ๋ง์ดํฌ๋ก์ํคํ ์ฒ ๊ธฐ๋ฐ์ Intel CPU์ฉ ๋น๋ ๋ชจ๋๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- AArch64 ๋ฐฑ์๋๋ ์ด์ Ampere Computing Ampere1C(ampere1c), Arm C1-Nano(c1-nano), Arm C1-Pro(c1-pro), Arm C1-Premium(c1-premium) ๋ฐ Arm C1-Ultra(c1-ultra) ํ๋ก์ธ์๋ฅผ ์ง์ํฉ๋๋ค. FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] ๋ฐ FCVTA[US] ๋ช ๋ น์ด์ ๋ํ ์ถ๊ฐ ๋ด์ฅ ํจ์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ํจ์ ๋ค์ค ๋ฒ์ ๊ด๋ฆฌ(FMV) ์ง์์ด ์์ ํ๋์์ต๋๋ค. ์ด์ ์ฌ์ฉ์๋ ์๋ก ๋ค๋ฅธ ํจ์ ๋ฒ์ ์ ์ฐ์ ์์๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
- LoongArch32(LA32R, LA32S) ์ํคํ ์ฒ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly ๋ฐ PowerPC ์ํคํ ์ฒ๋ฅผ ์ํ ํฅ์๋ ๋ฐฑ์๋.
์ถ์ฒ : opennet.ru
