XNUMX๊ฐ์๊ฐ์ ๊ฐ๋ฐ ๋์
LLVM 10.0์ ์๋ก์ด ๊ธฐ๋ฅ์๋ C++ ๊ฐ๋ ์ง์, ๋ ์ด์ Clang์ ๋ณ๋์ ํ๋ก์ธ์ค๋ก ์คํํ์ง ์์, Windows์ฉ CFG(์ ์ด ํ๋ฆ ๊ฐ๋) ๊ฒ์ฌ ์ง์, ์๋ก์ด CPU ๊ธฐ๋ฅ ์ง์์ด ํฌํจ๋ฉ๋๋ค.
- '์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
๊ฐ๋ ๋ค "๋ ์ฝ๋๋ช C++2a(-std=c++2a ํ๋๊ทธ๋ก ํ์ฑํ๋จ)์ธ ๋ค์ ํ์ค์ ํฌํจ๋ C++ ํ ํ๋ฆฟ ํ์ฅ์ ๋๋ค.
๊ฐ๋ ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์๋ก ํ์ฉ๋ ์ ์๋ ์ธ์ ์งํฉ์ ์ ํํ๋ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์ ์๊ตฌ ์ฌํญ ์งํฉ์ ์ ์ํ ์ ์์ต๋๋ค. ๊ฐ๋ ์ ํ ํ๋ฆฟ ๋ด์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์ ํ์ ์์ฑ๊ณผ ์ ๋ ฅ ๋งค๊ฐ๋ณ์์ ๋ฐ์ดํฐ ์ ํ ์์ฑ ๊ฐ์ ๋ ผ๋ฆฌ์ ๋ถ์ผ์น๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.์ฃผํ
๊ฐ๋ EqualityComparable = ์๊ตฌ(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-parentheses"๋ ๋ ผ๋ฆฌ ์ฐ์ฐ์ AND(&) ๋ฐ OR(|)๋ฅผ ์กฐ๊ฑด ์ฐ์ฐ์(?:)์ ํผํฉํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํด ๊ฒฝ๊ณ ํฉ๋๋ค.
- "-Wmisleading-indentation"์ GCC์ ๋์ผํ ์ด๋ฆ ๊ฒ์ฌ์ ์ ์ฌํฉ๋๋ค. ์ด๋ ๋ค์ฌ์ฐ๊ธฐ๋ ํํ์์ด if/else/for/while ๋ธ๋ก์ ์ผ๋ถ์ธ ๊ฒ์ฒ๋ผ ๊ฒฝ๊ณ ํ์ง๋ง ์ค์ ๋ก๋ ์ด ๋ธ๋ก์ ํฌํจ๋์ง ์์ต๋๋ค. .
- "-Wextra"๋ฅผ ์ง์ ํ๋ฉด "-Wdeprecated-copy" ๊ฒ์ฌ๊ฐ ํ์ฑํ๋์ด ์์ฑ์ ์ฌ์ฉ์ ๋ํด ๊ฒฝ๊ณ ํฉ๋๋ค.
๋ช ์์ ์ธ ์๋ฉธ์ ์ ์๊ฐ ์๋ ํด๋์ค์ "์ด๋" ๋ฐ "๋ณต์ฌ". - "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analytic" ๊ฒ์ฌ๊ฐ ํ์ฅ๋์์ต๋๋ค.
- "-Wbitwise-op-parentheses" ๋ฐ "-Wlogical-op-parentheses" ๊ฒ์ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค.
- C ๋ฐ C++ ์ฝ๋์์ ํฌ์ธํฐ ์ฐ์ ์ฐ์ฐ์ ๋ฐฐ์ด์์๋ง ํ์ฉ๋ฉ๋๋ค. "-fsanitize=pointer-overflow" ๋ชจ๋์ ์ ์๋์ง ์์ ๋์ Sanitizer๋ ์ด์ null ํฌ์ธํฐ์ 0์ด ์๋ ์คํ์ ์ ์ถ๊ฐํ๊ฑฐ๋ null์ด ์๋ ํฌ์ธํฐ์์ ์ ์๋ฅผ ๋บ ๋ null ํฌ์ธํฐ๋ฅผ ์์ฑํ๋ ๋ฑ์ ์ฌ๋ก๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
- "-fsanitize=implicit-conversion"(Implicit Conversion Sanitizer) ๋ชจ๋๋ "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=..."))) ์์ฑ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
-๋ถ๊ธฐ ๋ณดํธ . - Windows ํ๋ซํผ์์ "-cfguard" ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ๊ฐ์ ํจ์ ํธ์ถ์ ๋ํ ์คํ ํ๋ฆ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ(Control Flow Guard)๊ฐ ๋์ฒด๋ฉ๋๋ค. ๊ฒ์ฌ ๋์ฒด๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด "-cfguard-nochecks" ํ๋๊ทธ ๋๋ "__declspec(guard(nocf))" ์์ ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- gnu_inline ์์ฑ์ ๋์์ "extern" ํค์๋ ์์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ GCC์ ์ ์ฌํฉ๋๋ค.
- OpenCL ๋ฐ CUDA ์ง์๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ด ํ์ฅ๋์์ต๋๋ค. ์๋ก์ด OpenMP 5.0 ๊ธฐ๋ฅ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ํ์ค ์ต์ ์ด clang-format ์ ํธ๋ฆฌํฐ์ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ํ์์ ์ง์ ํ ๋ ์ฌ์ฉ๋๋ C++ ํ์ค ๋ฒ์ ์ ํ์ธํ ์ ์์ต๋๋ค(Latest, Auto, c++03, c++11, c++14, c++17, c++20).
- ์ ์ ๋ถ์๊ธฐ์ ์๋ก์ด ๊ฒ์ฌ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ถฉ๋ถํ ์ ์ฅ ๊ณต๊ฐ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํ alpha.cplusplus.PlacementNew, Fuchsia ํธ๋ค๋ฌ์ ๊ด๋ จ๋ ๋์ถ์ ๊ฐ์งํ๊ธฐ ์ํ fuchsia.HandleChecker, [NSCoder decodeValueOfObjCType ์ฌ์ฉ ์ ์ ์ฌ์ ์ธ ๋ฒํผ ์ค๋ฒํ๋ก๋ฅผ ๊ฐ์งํ๊ธฐ ์ํ security.insecureAPI.decodeValueOfObjCType] :์:] .
- UBSan(Undefine Behavior Sanitizer)์ NULL ํฌ์ธํฐ์ 0์ด ์๋ ์คํ์ ์ ์ ์ฉํ๊ฑฐ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก NULL ํฌ์ธํฐ ์คํ์ ์ ์ถ๊ฐํ๋ ๊ฒ์ ํฌ์ฐฉํ๊ธฐ ์ํด ํฌ์ธํฐ ์ค๋ฒํ๋ก ๊ฒ์ฌ๋ฅผ ํ์ฅํ์ต๋๋ค.
- ๋ฆฐํฐ์์ clang-tidy
์ถ๊ฐ ์๋ก์ด ์ํ์ ์๋น ๋ถ๋ถ.
์ฃผ์
- ํ๋ ์์ํฌ๋ก
์์ฑ์ ์๋ก์ด ํ๋ก์์ ๊ฐ ์ต์ ํ ๋ฐ ๋ถ์๊ธฐ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. 19๊ฐ ์์ฑ(12๊ฐ LLVM IR) ๋ฐ 12๊ฐ ์ถ์ ์์ฑ(์: ํ์ฑ)์ ํฌํจํ์ฌ 7๊ฐ ์์ฑ์ ์ํ๊ฐ ์์ธก๋ฉ๋๋ค. - ์ปดํ์ผ๋ฌ์ ๋ด์ฅ๋ ์๋ก์ด ํ๋ ฌ ์ํ ํจ์๋ฅผ ์ถ๊ฐํ์ต๋๋ค(
๋ด์ฌ )์ ์ปดํ์ผ ์ค์ ํจ์จ์ ์ธ ๋ฒกํฐ ๋ช ๋ น์ด๋ก ๋์ฒด๋ฉ๋๋ค. - 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) ๋ฐomic.fence ์ง์นจ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. SIMD ์ง์์ด ํฌ๊ฒ ํ์ฅ๋์์ต๋๋ค. WebAssembly ๊ฐ์ฒด ํ์ผ์๋ ์ด์ ๋ค์ค ๊ฐ ํจ์ ์๋ช ์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
- ๋ถ์๊ธฐ๋ ๋ฃจํ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌSSA , ๋ค์ํ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ฐ์ ์ข ์์ฑ์ ์ ์ํ ์ ์์ต๋๋ค. MemorySSA๋ ์ปดํ์ผ ๋ฐ ์คํ ์๊ฐ์ ๋จ์ถํ๊ฑฐ๋ ์ฑ๋ฅ ์ ํ ์์ด AliasSetTracker ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - LLDB ๋๋ฒ๊ฑฐ์์๋ DWARF v5 ํ์์ ๋ํ ์ง์์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค. MinGW๋ฅผ ์ฌ์ฉํ ๋น๋ ์ง์ ๊ฐ์
ARM ๋ฐ ARM64 ์ํคํ ์ฒ์ฉ Windows ์คํ ํ์ผ์ ๋๋ฒ๊ทธํ๋ ์ด๊ธฐ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ํญ์ ๋๋ฌ ์ ๋ ฅ์ ์๋ ์์ฑํ ๋ ์ ๊ณต๋๋ ์ต์ ์ ๋ํ ์ค๋ช ์ ์ถ๊ฐํ์ต๋๋ค. -
ํผ์ง๋ LLD ๋ง์ปค ๊ธฐ๋ฅ. GNU ๋ง์ปค์ glob ํ ํ๋ฆฟ์ ์์ ํ ํธํ์ฑ์ ํฌํจํ์ฌ ELF ํ์์ ๋ํ ํฅ์๋ ์ง์, ์์ถ๋ ๋๋ฒ๊ทธ ์น์ ".zdebug"์ ๋ํ ์ง์ ์ถ๊ฐ, .note.gnu.property ์น์ ์ ์ ์ํ๊ธฐ ์ํ PT_GNU_PROPERTY ์์ฑ ์ถ๊ฐ(ํฅํ Linux์์ ์ฌ์ฉํ ์ ์์) ์ปค๋),
"-z noseparate-code", "-z ๋ถ๋ฆฌ ์ฝ๋" ๋ฐ "-z ๋ถ๋ฆฌ ๋ก๋ ๊ฐ๋ฅ ์ธ๊ทธ๋จผํธ" ๋ชจ๋๊ฐ ๊ตฌํ๋์์ต๋๋ค. MinGW ๋ฐ WebAssembly์ ๋ํ ์ง์์ด ํฅ์๋์์ต๋๋ค.
์ถ์ฒ : opennet.ru