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

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

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

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

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

  • 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