๐Ÿ‰ LLVM ๋ง›๋ณด๊ธฐ ๐Ÿ‰

2hoยท2024๋…„ 1์›” 9์ผ

LLVM

๋ชฉ๋ก ๋ณด๊ธฐ
2/2


LLVM - ์˜คํ”ˆ ์†Œ์Šค ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„.
(Low-Level Virtual Machine์˜ ์•ฝ์ž)
์—ฌ๋Ÿฌ๊ตฐ๋ฐ ์ฐพ์•„๋ณด๋ฉด์„œ ๋„์›€์ด ๋˜๋Š” ์ž๋ฃŒ๋ฅผ ๊ฐ€์ ธ์™€ ๋ดค๋‹ค.

LLVM ๊ณต์‹ ์‚ฌ์ดํŠธ, LLVM ๊นƒํ—ˆ๋ธŒ

์šฐ์„  ์ฒซ๋ฒˆ์งธ๋กœ LLVM ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

$ mkdir eva =-llvm
$ cd eva-llvm
$ clang++ --version

๊ทธ๋ฆฌ๊ณ  LLVM๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

$ sudo port install llvm-16 
// 16์€ version

๋ฒ„์ „์€ 16์œผ๋กœ ๋‹ค์šดํ•˜์˜€๋‹ค.

LLVM ๋ฒ„์ „ ์„ ํƒ์ฝ”๋“œ

$ port select โ€”list llvm

๋ฒ„์ „์„ ํƒ, ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ๋˜๋„๋ก ์ ์šฉ

$ sudo port select --set llvm mp-llvm-16
$ llc --version  // llc ํ™•์ธ

test.cpp ํŒŒ์ผ ์ƒ์„ฑ

test.cppํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์ž (c++)

$ touch test.cpp  //ํŒŒ์ผ ์ƒ์„ฑ
$ clang++ -S -emit-llvm test.cpp //test.cpp์„ IR๋กœ ๋ณ€ํ™˜
$ clang++ -o test test.ll //test.llํŒŒ์ผ IR๋กœ ๋ณ€ํ™˜๋œ๊ฑฐ ์ปดํŒŒ์ผ, ์‹คํ–‰ํ•œ ํŒŒ์ผ test ์ƒ์„ฑ
$ lli --version //lli ํ™•์ธ

LLVM ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์‹คํ–‰

$ lli test.ll
=LLVM IR=

target datalayout = ...

(์ƒ)๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ž์—ด = ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ํ‘œํ˜„ => ์ •๋ ฌ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํฌ๊ธฐ endian(์—”๋””์–ธ) ํฌ๊ธฐ, ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ์‹ถ์œผ๋ฉด ์—ฌ๊ธฐ๋กœ

(ํ•˜) ์ตœ์†Œํ•œ์˜ LLVM IR ํ”„๋กœ๊ทธ๋žจ

=LLVM IR=

define i32 @main(){
  ret i32 42
}

์ปดํŒŒ์ผ, ์ถœ๋ ฅ ๊ทธ๋ฆฌ๊ณ  ./test ์ข…๋ฃŒ ์ฝ”๋“œ

$ clang++ -o test test.ll; ./test; echo $?

[echo $? => ์ด์ „๋ช…๋ น์–ด ์ข…๋ฃŒ ์ฝ”๋“œ]

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ๋Š” LLVM์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌํ˜•์‹์˜ LLVM ๋น„ํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด๋ณด์ž

$ llvm-as test.ll

test.bc ํŒŒ์ผ ์ƒ์„ฑ

LLVM ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ํ•ด๋‹น ์ฝ”๋“œ ํ…์ŠคํŠธ ํ˜•์‹์˜ LLVM ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ณ€ํ™˜, ์ €์žฅ

$ llvm-dis test.bc -o test-2.ll

c++ ์ปดํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ, test.llํŒŒ์ผ์— ์žˆ๋Š” LLVM IR์ฝ”๋“œ๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜

$ llvm-dis test.bc -o test-2.ll
profile
!developer

0๊ฐœ์˜ ๋Œ“๊ธ€