
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