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

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

LLVM 10.0์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์—๋Š” C++ ๊ฐœ๋… ์ง€์›, ๋” ์ด์ƒ Clang์„ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š์Œ, Windows์šฉ CFG(์ œ์–ด ํ๋ฆ„ ๊ฐ€๋“œ) ๊ฒ€์‚ฌ ์ง€์›, ์ƒˆ๋กœ์šด CPU ๊ธฐ๋Šฅ ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ๋Ÿ‰ Clang 10.0์—์„œ:

  • '์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.๊ฐœ๋…๋“ค"๋Š” ์ฝ”๋“œ๋ช… 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 ์ถ”๊ฐ€ ์ƒˆ๋กœ์šด ์ˆ˜ํ‘œ์˜ ์ƒ๋‹น ๋ถ€๋ถ„.

์ฃผ์š” ํ˜์‹  LLVM 10.0:

  • ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์†์„ฑ์ž ์ƒˆ๋กœ์šด ํ”„๋กœ์‹œ์ € ๊ฐ„ ์ตœ์ ํ™” ๋ฐ ๋ถ„์„๊ธฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 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

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