LLVM build와 install을 마쳤으니 LLVM Pass를 실행해보자. github에서 skeleton pass를 다운받아 실행시켜보려고 한다.
1. Clone LLVM Skeleton Pass
git clone https://github.com/manggoguy/llvm-pass-skeleton.git
cd llvm-pass-skeleton (clone한 path)
mkdir build
소스코드의 구성을 살펴보자.
- 하나의 Pass당 .h와 .cpp가 하나씩 구성되어있다.
- ModulePass를 상속받는 클래스 생성한다.
- 실질적인 동작 수행은 runOnModule에서 이뤄진다.
- runOnModule 에서는 모듈의 모든 함수의 이름을 출력한다.
2. Source file 생성
vi test.c
target이 될 source file을 준비한다. function1과 "hello world"를 출력하는 main 함수를 정의했다.
3. Build LLVM Skeleton Pass
cmake ../
cmake -build .
clang -emit-llvm -c "test.c"
opt -load ./lib/libSkeletonPass.so -skeleton test.bc -o out.bc
cmake ../ 와 cmake -build .을 수행한 뒤, build 폴더를 확인해보면 다음과 같다.
clang -emit-llvm -c "test.c" 을 수행한 뒤, build 폴더를 확인해보면 다음과 같다. test.bc 파일이 생성되었다. printf 함수에서 warning이 발생했는데 원인은 모르겠다.
opt -load ./lib/libSkeletonPass.so -skeleton test.bc -o out.bc을 수행하면 다음과 같이 test.c 파일에서 작성한 함수의 이름 (function1, main, printf )이 모두 출력되는 것을 확인할 수 있다.
Reference
https://github.com/manggoguy/llvm-pass-skeleton