XNUMX๊ฐ์๊ฐ์ ๊ฐ๋ฐ ๋์
LLVM 9.0์ ์๋ก์ด ๊ธฐ๋ฅ์๋ ๋์ RISC-V ํ๋ซํผ์์ ์คํ์ ์ค๊ณ ํ๊ทธ ์ ๊ฑฐ, OpenCL์ ๋ํ C++ ์ง์, ํ๋ก๊ทธ๋จ์ LLD์์ ๋์ ์ผ๋ก ๋ก๋๋ ๋ถ๋ถ์ผ๋ก ๋ถํ ํ๋ ๊ธฐ๋ฅ ๋ฐ "
-
์ถ๊ฐ๋จ GCC ๊ด๋ จ ํํ์ ๊ตฌํ "asm ๊ณ ํ "๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ ๋ธ๋ฌ ์ธ๋ผ์ธ ๋ธ๋ก์์ C ์ฝ๋์ ๋ ์ด๋ธ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ x86_64 ์ํคํ ์ฒ๊ฐ ์๋ ์์คํ ์์ Clang์ ์ฌ์ฉํ์ฌ "CONFIG_JUMP_LABEL=y" ๋ชจ๋์์ Linux ์ปค๋์ ๋น๋ํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์ด์ ๋ฆด๋ฆฌ์ค์ ์ถ๊ฐ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ ๋ คํ์ฌ ์ด์ x86_64 ์ํคํ ์ฒ์ฉ Clang์์ Linux ์ปค๋์ ๋น๋ํ ์ ์์ต๋๋ค(์ด์ ์๋ arm, aarch64, ppc32, ppc64le ๋ฐ mips ์ํคํ ์ฒ์ฉ ๋น๋๋ง ์ง์๋์์ต๋๋ค). ๋ํ Android ๋ฐ ChromeOS ํ๋ก์ ํธ๋ ์ด๋ฏธ ์ปค๋ ๊ตฌ์ถ์ Clang์ ์ฌ์ฉํ๋๋ก ์ ํ๋์์ผ๋ฉฐ Google์ ํ๋ก๋์ Linux ์์คํ ์ฉ ์ปค๋ ๊ตฌ์ถ์ ์ํ ์ฃผ์ ํ๋ซํผ์ผ๋ก Clang์ ํ ์คํธํ๊ณ ์์ต๋๋ค. ์์ผ๋ก๋ LLD, llvm-objcopy, llvm-ar, llvm-nm ๋ฐ llvm-objdump๋ฅผ ํฌํจํ ๋ค๋ฅธ LLVM ๊ตฌ์ฑ ์์๋ฅผ ์ปค๋ ๋น๋ ํ๋ก์ธ์ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - OpenCL์์ C++17์ ์ฌ์ฉํ๊ธฐ ์ํ ์คํ์ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ํน์ ๊ธฐ๋ฅ์๋ ์ฃผ์ ๊ณต๊ฐ ์์ฑ ์ง์, ์ ํ ์บ์คํ ์ฐ์ฐ์์ ์ํ ์ฃผ์ ๊ณต๊ฐ ๋ณํ ์ฐจ๋จ, C์ฉ OpenCL๊ณผ ๊ฐ์ ๋ฒกํฐ ์ ํ ์ ๊ณต, ์ด๋ฏธ์ง, ์ด๋ฒคํธ, ์ฑ๋ ๋ฑ์ ๋ํ ํน์ OpenCL ์ ํ ์กด์ฌ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
- ํ๋ฐํธ์๋(๊ตฌ๋ฌธ ๋ถ์, ์ด๊ธฐํ) ๋ฐ ๋ฐฑ์๋(์ต์ ํ ๋จ๊ณ)์ ๋ค์ํ ๋จ๊ณ์ ์คํ ์๊ฐ์ ๋ํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ธฐ ์ํด ์๋ก์ด ์ปดํ์ผ๋ฌ ํ๋๊ทธ "-ftime-trace" ๋ฐ "-ftime-trace-granularity=N"์ ์ถ๊ฐํ์ต๋๋ค. ๋ณด๊ณ ์๋ chrome://tracing ๋ฐ speedscope.app๊ณผ ํธํ๋๋ json ํ์์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
- Visual Studio ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์๋ "__declspec(allocator)" ์ง์ ์ ์ฒ๋ฆฌ ๋ฐ ๋๋ฒ๊น ์ ๋ณด ์์ฑ์ด ์ถ๊ฐ๋์์ต๋๋ค.
- C ์ธ์ด์ ๊ฒฝ์ฐ โ__FILE__โ ๋งคํฌ๋ก์ ์ ์ฌํ์ง๋ง ์ ์ฒด ๊ฒฝ๋ก ์์ด ํ์ผ ์ด๋ฆ๋ง ํฌํจํ๋ โ__FILE_NAME__โ ๋งคํฌ๋ก์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- C++์์๋ ๋งค๊ฐ๋ณ์ ๋ฐ ์ธ์ ํจํด, ์ฐธ์กฐ ์ ํ, ๋ฐํ ์ ํ ์ถ๋ก , ๊ฐ์ฒด, ์๋ ์์ฑ ํจ์, ๋ด์ฅ ์ฐ์ฐ์ ๋ฑ ๋ค์ํ C++ ๊ธฐ๋ฅ์ ํฌ๊ดํ๊ธฐ ์ํด ์ฃผ์ ๊ณต๊ฐ ํน์ฑ์ ๋ํ ์ง์์ ํ์ฅํ์ต๋๋ค.
- OpenCL, OpenMP ๋ฐ CUDA ์ง์๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ด ํ์ฅ๋์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ด์ฅ OpenCL ํจ์("-fdeclare-opencl-builtins" ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋จ)์ ์์์ ํฌํจ์ ๋ํ ์ด๊ธฐ ์ง์, cl_arm_integer_dot_product ํ์ฅ์ด ๊ตฌํ๋๊ณ ์ง๋จ ๋๊ตฌ๊ฐ ํ์ฅ๋์์ต๋๋ค.
- ์ ์ ๋ถ์๊ธฐ์ ์์
์ด ๊ฐ์ ๋์์ผ๋ฉฐ ์ ์ ๋ถ์ ์ํ์ ๋ํ ๋ฌธ์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ฌ๊ธฐ ๋ชจ๋ ๋ฐ ์ง์๋๋ ์ต์
("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" ๋ฐ "-analyzer-checker[-option]-help)์ ํ์ํ๋ ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. " -๊ฐ๋ฐ์"). ๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด "-analyzer-werror" ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์๋ก์ด ํ์ธ ๋ชจ๋๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.- security.insecureAPI.DeprecatedOrUnsafeBufferHandling์ ๋ฒํผ ์์ ์ ์์ ํ์ง ์์ ๋ฐฉ์์ ์๋ณํฉ๋๋ค.
- osx.MIGChecker๋ MIG(Mach Interface Generator) ํธ์ถ ๊ท์น ์๋ฐ์ ๊ฒ์ํฉ๋๋ค.
- optin.osx.OSObjectCStyleCast๋ฅผ ์ฌ์ฉํ์ฌ ์๋ชป๋ XNU libkern ๊ฐ์ฒด ๋ณํ์ ์ฐพ์ต๋๋ค.
- LLVM ์ฝ๋๋ฒ ์ด์ค์ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํ ์ผ๋ จ์ ๋ชจ๋ธ๋ง ๊ฒ์ฌ ๊ธฐ๋ฅ์ด ํฌํจ๋ apiModeling.llvm
- ์ด๊ธฐํ๋์ง ์์ C++ ๊ฐ์ฒด๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํ ์์ ํ๋ ์ฝ๋(optin.cplusplus ํจํค์ง์ UninitializedObject)
- clang-format ์ ํธ๋ฆฌํฐ๋ C# ์ธ์ด์ ์ฝ๋ ํ์ ์ง์ ์ ๋ํ ์ง์์ ์ถ๊ฐํ์ผ๋ฉฐ Microsoft์์ ์ฌ์ฉํ๋ ์ฝ๋ ํ์ ์ง์ ์คํ์ผ์ ๋ํ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- Visual Studio์ ํฌํจ๋ cl.exe ์ปดํ์ผ๋ฌ์์ ์ต์ ์์ค ํธํ์ฑ์ ์ ๊ณตํ๋ ๋์ฒด ๋ช ๋ น์ค ์ธํฐํ์ด์ค์ธ clang-cl์๋ ์กด์ฌํ์ง ์๋ ํ์ผ์ ๋ช ๋ น์ค ์ต์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ํด๋น ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๋ ๊ฒฝํ์ ๋ฐฉ๋ฒ์ด ์ถ๊ฐ๋์์ต๋๋ค(์: "clang-cl /diagnostic :caret /c test.cc"๋ฅผ ์คํํ ๋);
- OpenMP API์ ๊ด๋ จ๋ ์ถ๊ฐ ๊ฒ์ฌ๋ฅผ ํฌํจํ์ฌ ๋ง์ ์๋ก์ด ๊ฒ์ฌ๊ฐ linter clang-tidy์ ์ถ๊ฐ๋์์ต๋๋ค.
-
ํผ์ง๋ ์๋ฒ ๊ธฐ๋ฅ์พ ์พ (Clang ์๋ฒ), ๋ฐฑ๊ทธ๋ผ์ด๋ ์ธ๋ฑ์ค ๊ตฌ์ถ ๋ชจ๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ผ๋ฉฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ํฉ๋ณ ์์ ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค(๋ณ์ ๊ฒ์, ์๋ ๋ฐ ๋งคํฌ๋ก ์ ์ ํ์ฅ, ์ด์ค์ผ์ดํ๋ ๋ฌธ์์ด์ ์ด์ค์ผ์ดํ๋์ง ์์ ๋ฌธ์์ด๋ก ๋ณํ). Clang-tidy์ ๊ฒฝ๊ณ , ํค๋ ํ์ผ์ ์ค๋ฅ ์ง๋จ ํ์ฅ, ์ ํ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ํ ์ ๋ณด ํ์ ๊ธฐ๋ฅ ์ถ๊ฐ
์ฃผ์
- ์คํ์ ์ธ ๋ถํ ๊ธฐ๋ฅ์ด LLD ๋ง์ปค์ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋์ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋ถํ ํ ์ ์์ผ๋ฉฐ ๊ฐ ๋ถ๋ถ์ ๋ณ๋์ ELF ํ์ผ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์์
์ค์ ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ฅผ ๋ก๋ํ๋ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ๋ถ๋ถ์ ์์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ด์ฅ PDF ๋ทฐ์ด๋ฅผ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉ์๊ฐ PDF๋ฅผ ์ด ๋๋ง ๋ก๋ํ ์ ์์ต๋๋ค. ํ์ผ).
LLD ๋ง์ปค
๊ฐ์ ธ์จ arm32_7, arm64, ppc64le ๋ฐ x86_64 ์ํคํ ์ฒ์ฉ Linux ์ปค๋์ ์ฐ๊ฒฐํ๊ธฐ์ ์ ํฉํ ์ํ๋ก ๋ง๋ญ๋๋ค.
์๋ก์ด ์ต์ "-"(stdout์ผ๋ก ์ถ๋ ฅ), "-[no-]allow-shlib-undefine", "-undefine-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" ๋ฐ "-z ๊ณตํต ํ์ด์ง ํฌ๊ธฐ". AArch64 ์ํคํ ์ฒ์ ๊ฒฝ์ฐ BTI(๋ถ๊ธฐ ๋์ ํ์๊ธฐ) ๋ฐ PAC(ํฌ์ธํฐ ์ธ์ฆ ์ฝ๋) ์ง์นจ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. MIPS, RISC-V ๋ฐ PowerPC ํ๋ซํผ์ ๋ํ ์ง์์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค. WebAssembly์ ๋ํ ๋์ ๋งํฌ์ ๋ํ ์ด๊ธฐ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. - libc++์์
๊ตฌํ ํจ์ ssize, std::is_constant_evaluated, std::midpoint ๋ฐ std::lerp, "front" ๋ฐ "back" ๋ฉ์๋๊ฐ std::span์ ์ถ๊ฐ๋์์ผ๋ฉฐ, std::is_unbounded_array ๋ฐ std::is_bounded_array ์ ํ์ ์์ฑ์ด ์ถ๊ฐ๋์์ต๋๋ค. , std ๊ธฐ๋ฅ์ด ํ์ฅ๋์์ต๋๋ค: :atomic. GCC 4.9์ ๋ํ ์ง์์ด ์ค๋จ๋์์ต๋๋ค(GCC 5.1 ๋ฐ ์ต์ ๋ฆด๋ฆฌ์ค์์ ์ฌ์ฉํ ์ ์์). ์ถ๊ฐ๋ ์ง์๋ด๊ฐ ๊ทธ๋ฌ๋ (WebAssembly ์์คํ ์ธํฐํ์ด์ค, ๋ธ๋ผ์ฐ์ ์ธ๋ถ์์ WebAssembly๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ธํฐํ์ด์ค) - ์๋ก์ด ์ต์ ํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ผ๋ถ ์ํฉ์์๋ memcmp ํธ์ถ์ bcmp๋ก ๋ณํํ ์ ์์ต๋๋ค. ํ์ ์ค์์น ๋ธ๋ก์ ๋๋ฌํ ์ ์๊ฑฐ๋ ๋ช ๋ น์ด๊ฐ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ(์: void ์ ํ์ ํจ์ ํธ์ถ ์) ์ ํ ํ ์ด๋ธ์ ๋ํ ๋ฒ์ ๊ฒ์ฌ ์๋ต์ด ๊ตฌํ๋์์ต๋๋ค.
- RISC-V ์ํคํ ์ฒ์ ๋ฐฑ์๋๊ฐ ์์ ํ๋์ด ๋ ์ด์ ์คํ์ ์ธ ์์น์ ์์ง ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ์ถ๋ฉ๋๋ค. MAFDC ํ์ฅ์ด ํฌํจ๋ RV32I ๋ฐ RV64I ๋ช ๋ น์ด ์ธํธ ๋ณํ์ ๋ํ ์ ์ฒด ์ฝ๋ ์์ฑ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ๋ฐ PowerPC ์ํคํ
์ฒ์ ๋ฐฑ์๋๊ฐ ๋ง์ด ๊ฐ์ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฑด์ถ์ ๊ฒฝ์ฐ
AArch64๋ SVE2(Scalable Vector Extension 2) ๋ฐ MTE(Memory Tagged Extensions) ๋ช ๋ น์ ๋ํ ์ง์์ ์ถ๊ฐํ์ผ๋ฉฐ, ARM ๋ฐฑ์๋์๋ Armv8.1-M ์ํคํ ์ฒ ๋ฐ MVE(M-Profile Vector Extension) ํ์ฅ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. GFX10(Navi) ์ํคํ ์ฒ์ ๋ํ ์ง์์ด AMDGPU ๋ฐฑ์๋์ ์ถ๊ฐ๋์์ผ๋ฉฐ ํจ์ ํธ์ถ ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์์ผ๋ฉฐ ๊ฒฐํฉ ํจ์ค๊ฐ ํ์ฑํ๋์์ต๋๋ค.DPP (๋ฐ์ดํฐ ๋ณ๋ ฌ ๊ธฐ๋ณธ ์์). - ์ด์ LLDB ๋๋ฒ๊ฑฐ์๋ ์ญ์ถ์ ์ ๋ํ ์์ ๊ฐ์กฐ ํ์๊ฐ ์๊ณ DWARF4 debug_types ๋ฐ DWARF5 debug_info ๋ธ๋ก์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- COFF ํ์์ ๊ฐ์ฒด ๋ฐ ์คํ ํ์ผ์ ๋ํ ์ง์์ด llvm-objcopy ๋ฐ llvm-strip ์ ํธ๋ฆฌํฐ์ ์ถ๊ฐ๋์์ต๋๋ค.
์ถ์ฒ : opennet.ru