LLVM 15.0 ์ปดํŒŒ์ผ๋Ÿฌ ์ œํ’ˆ๊ตฐ ์ถœ์‹œ

15.0๊ฐœ์›”๊ฐ„์˜ ๊ฐœ๋ฐœ ๋์— LLVM XNUMX ํ”„๋กœ์ ํŠธ์˜ ์ถœ์‹œ๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ RISC์™€ ๊ฐ™์€ ๊ฐ€์ƒ ๋ช…๋ น์–ด์˜ ์ค‘๊ฐ„ ๋น„ํŠธ์ฝ”๋“œ(๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ฐ€์ƒ ๋จธ์‹ )๋กœ ์ปดํŒŒ์ผํ•˜๋Š” GCC ํ˜ธํ™˜ ํˆดํ‚ท(์ปดํŒŒ์ผ๋Ÿฌ, ์˜ตํ‹ฐ๋งˆ์ด์ € ๋ฐ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ)์ž…๋‹ˆ๋‹ค. ๋‹ค๋‹จ๊ณ„ ์ตœ์ ํ™” ์‹œ์Šคํ…œ). ์ƒ์„ฑ๋œ ์˜์‚ฌ์ฝ”๋“œ๋Š” JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ง์ ‘ ๊ธฐ๊ณ„์–ด ๋ช…๋ น์–ด๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Clang 15.0์˜ ์ฃผ์š” ๊ฐœ์„  ์‚ฌํ•ญ:

  • x86 ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ "-fzero-call-used-regs" ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ํ•จ์ˆ˜์—์„œ ์ œ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋œ ๋ชจ๋“  CPU ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ 20์œผ๋กœ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์—์„œ ์ •๋ณด ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ต์Šคํ”Œ๋กœ์ž‡์—์„œ ROP(๋ฐ˜ํ™˜ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) ๊ฐ€์ ฏ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•œ ๋ธ”๋ก ์ˆ˜๋ฅผ ์•ฝ XNUMX% ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ตฌ์กฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ์น˜ ๋ฌด์ž‘์œ„ํ™”๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌ์กฐ์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„ํ™”๋Š” randomize_layout ๋ฐ no_randomize_layout ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผœ๊ณ  ๋„๋ฉฐ "-frandomize-layout-seed" ๋˜๋Š” "-frandomize-layout-seed-file" ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • "-fstrict-flex-arrays=" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. "๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์กฐ(๊ตฌ์กฐ ๋์— ํฌ๊ธฐ๊ฐ€ ๋ฌดํ•œํ•œ ๋ฐฐ์—ด์ธ ์œ ์—ฐํ•œ ๋ฐฐ์—ด ๋ฉค๋ฒ„)์˜ ์œ ์—ฐํ•œ ๋ฐฐ์—ด ์š”์†Œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0(๊ธฐ๋ณธ๊ฐ’)์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฐฐ์—ด์ด ์žˆ๋Š” ๊ตฌ์กฐ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋Š” ํ•ญ์ƒ ์œ ์—ฐํ•œ ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. 1 - ํฌ๊ธฐ [], [0] ๋ฐ [1]๋งŒ ์œ ์—ฐํ•œ ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ , 2 - ํฌ๊ธฐ๋งŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. [] ๋ฐ [0]์€ ์œ ์—ฐํ•œ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์…ฐ์ด๋” ์ž‘์„ฑ์„ ์œ„ํ•ด DirectX์—์„œ ์‚ฌ์šฉ๋˜๋Š” C์™€ ์œ ์‚ฌํ•œ ์–ธ์–ด HLSL(High-Level Shader Language)์— ๋Œ€ํ•œ ์‹คํ—˜์  ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์ • ๋ฐ ๊ฐ€๋ณ€ ๊ธธ์ด ๋ฐฐ์—ด๊ณผ ๊ด€๋ จ๋œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ธ์ˆ˜ ์„ ์–ธ์ด ์žˆ๋Š” ํ•จ์ˆ˜ ์žฌ์ •์˜์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด "-Warray-parameter"๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • MSVC์™€์˜ ํ˜ธํ™˜์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. MSVC์—์„œ ์ œ๊ณต๋˜๋Š” "#pragma ํ•จ์ˆ˜"(์ธ๋ผ์ธ ํ™•์žฅ ๋Œ€์‹  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ƒ์„ฑํ•˜๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ์— ์ง€์‹œ) ๋ฐ "#pragma alloc_text"(ํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ์„น์…˜ ์ด๋ฆ„ ์ •์˜)์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. MSVC ํ˜ธํ™˜ /JMC ๋ฐ /JMC ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ C2X ๋ฐ C++23 ํ‘œ์ค€์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C ์–ธ์–ด์˜ ๊ฒฝ์šฐ noreturn ์†์„ฑ, ํ‚ค์›Œ๋“œ false ๋ฐ true, ์ง€์ •๋œ ๋น„ํŠธ ๊นŠ์ด์˜ ์ •์ˆ˜์— ๋Œ€ํ•œ _BitInt(N) ์œ ํ˜•, *_WIDTH ๋งคํฌ๋กœ, UTF-8 ์ธ์ฝ”๋”ฉ ๋ฌธ์ž์— ๋Œ€ํ•œ u8 ์ ‘๋‘์‚ฌ๊ฐ€ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

    C++์˜ ๊ฒฝ์šฐ ๋ชจ๋“ˆ ๋ณ‘ํ•ฉ, ํ•จ์ˆ˜ ๋ฉค๋ฒ„์˜ ABI ๊ฒฉ๋ฆฌ, ๋ชจ๋“ˆ ๋‚ด ๋น„์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ˆœ์„œํ™”๋œ ๋™์  ์ดˆ๊ธฐํ™”, ๋‹ค์ฐจ์› ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž, auto(x), ๋น„๋ฆฌํ„ฐ๋Ÿด ๋ณ€์ˆ˜, goto ๋ฐ constexpr๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜์˜ ๋ ˆ์ด๋ธ” ๋“ฑ์ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. , ๊ตฌ๋ถ„๋œ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค, ๋ช…๋ช…๋œ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.

  • OpenCL ๋ฐ OpenMP ์ง€์›๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. OpenCL ํ™•์žฅ cl_khr_subgroup_rotate์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • x86 ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด ์•ž์œผ๋กœ ์ ํ”„ ์ž‘์—… ํ›„ ์ถ”์ธก์— ๋”ฐ๋ฅธ ๋ช…๋ น์–ด ์‹คํ–‰์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ํ”„๋กœ์„ธ์„œ์˜ ์ทจ์•ฝ์„ฑ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ถ„๊ธฐ ๋ช…๋ น ์งํ›„์˜ ๋ช…๋ น์„ ์„ ์ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(SLS, Straight Line Speculation). ๋ณดํ˜ธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด "-mharden-sls=[none|all|return|indirect-jmp]" ์˜ต์…˜์ด ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  • SSE2 ํ™•์žฅ์„ ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ์˜ ๊ฒฝ์šฐ _Float16 ์œ ํ˜•์ด ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” AVX512-FP16 ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์ง€์›์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ float ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋ฎฌ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๋‹ค.
  • AMD Zen2 ํ”„๋กœ์„ธ์„œ๋ถ€ํ„ฐ ์ง€์›๋˜๋Š” RDPRU ๋ช…๋ น ์‚ฌ์šฉ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด "-m[no-]rdpru" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • RETBLEED ์ทจ์•ฝ์ ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด "-mfunction-return=thunk-extern" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ๊ฐ„์ ‘ ๋ถ„๊ธฐ์— ๋Œ€ํ•œ ์ถ”์ธก ์‹คํ–‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ฐœ์ž…์„ ์ œ์™ธํ•˜๋Š” ์ผ๋ จ์˜ ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

LLVM 15.0์˜ ์ฃผ์š” ํ˜์‹  ์‚ฌํ•ญ:

  • Cortex-M85 CPU, Armv9-A, Armv9.1-A ๋ฐ Armv9.2-A ์•„ํ‚คํ…์ฒ˜, Armv8.1-M PACBTI-M ํ™•์žฅ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • DirectX ์…ฐ์ด๋”์— ์‚ฌ์šฉ๋˜๋Š” DXIL(DirectX Intermediate Language) ํ˜•์‹์„ ์ง€์›ํ•˜๋Š” DirectX์šฉ ์‹คํ—˜์  ๋ฐฑ์—”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ค‘์— "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
  • Libc++๋Š” "ํ˜•์‹" ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„ ์™„๋ฃŒ์™€ "๋ฒ”์œ„" ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ œ์•ˆ๋œ ์‹คํ—˜ ๋ฒ„์ „์„ ํฌํ•จํ•˜์—ฌ C++20 ๋ฐ C++2b ํ‘œ์ค€์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ณ„์† ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • x86, PowerPC ๋ฐ RISC-V ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ„ํ•œ ํ–ฅ์ƒ๋œ ๋ฐฑ์—”๋“œ.
  • LLD ๋ง์ปค ๋ฐ LLDB ๋””๋ฒ„๊ฑฐ์˜ ๊ธฐ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€