Posts LLVM - LLVM Pass 만들기
Post
Cancel

LLVM - LLVM Pass 만들기

오늘부터 모각코 형식으로 시간을 정해서 팀원들과 같이 공부하기로 했다! 이번 주의 목표는…

  • 패스 만드는 법 다시 요약정리 해 두기
  • ModulePass 다뤄보기, runModule함수로 뭔가 해보고 제대로 실행까지

원래 pass에서 module? 다루는 법을 주로 하려고 했는데 공부하는 김에 패스 만드는법도 같이 정리해두면 나중에 써먹기 좋을 것 같다(❁´◡`❁)

-LLVM Pass 만들기

https://yam-cha.tistory.com/69?category=935948

이 글에서처럼 lib/Transform/Name에 CMakeList.txt 파일과 Name.cpp을 만들고, 그 상위폴더인 lib/Transform에 있는 CMakeList.txt의 맨 아랫줄에 add_subdirectory(Name)을 추가해줌

cpp에서 동작을 작성할 수 있고 상위 폴더에서 make를 해서 만들어진 .so파일을 확인할 수 있음

(코드는 해당 깃허브 참고 : https://github.com/sampsyo/llvm-pass-skeleton )

-input 파일 만들기

C 파일을 생성하고 clang name.c -o name 를 통해 컴파일

clang -O3 -emit-llvm name.c -c -o name.bc 를 통해 c파일을 llvm 비트코드 파일로 변환

./name 또는 lli name.bc를 통해 실행할 수 있음

gcc hello.s -o hello.native

-그 이후

pass와 input파일이 준비되면 opt -load lib/NAME.so -NAME < INPUT.bc > /dev/null 을 통해 출력 볼수있고

opt -load lib/NAME.so -help 이건 패스에 대한 도움말이랑 opt -load lib/NAME.so -INPUT -time-passes < INPUT.bc > /dev/null 이건 시간측정같은거?

-직접 해보기

01

https://www.cs.cornell.edu/~asampson/blog/clangpass.html

자꾸 내가 만든 파일에서 실행이 안 되어서 이 페이지를 참고해봐도

여기에 뭐가 들어가야하는지 잘 모르겠다… 아무래도 skeleton 코드는 clang -Xclang -load -Xclang ~.so 이런 명령어로 실행되게 바꿔놓은듯함

예전 코드를 참고해보니까

노란색 부분에서 다른 점이 있어서 다시 패스를 수정해보기로!

해결되면 ModulePass를 다루는 부분을 해 볼 것이다.

02

문제를 해결했다. 위에서 좀 고칠 부분이 많아졌다 registerPass 함수에서 옵션? 을 정의를 해줘야 되는 것 같다. 아니면 위에 있는 방식으로 돌렫 될 것 같다

1
2
3
4
char Hello::ID = 0;
static RegisterPass<Hello> X("hello", "Hello World Pass",
                             false /* Only looks at CFG */,
                             false /* Analysis Pass */);

위와 같이 registerPass에 yam 이라는 옵션? 을 주고 실행할 때 opt -load lib/NAME.so -yam < INPUT.bc > /dev/null 로 실행하니 결과가 나왔다.

고친 뒤에 clang ~~명령어로도 실행이 되는지 궁금해서 코드를 원래대로 돌린 뒤 다시 해 보았다

03

위의 명령어로도 된다!

1
2
clang -Xclang -load -Xclang lib/libYamtestPass.* yamTestSourceFiles/hello.c

마무리

오늘은 두번째 목표인 ModulePass다뤄보는 부분은 못 했다ㅠㅠ 시간이 부족했는데 목요일까지 개인적으로 더 해볼 생각이다. modulpass부분을 추가하는 것만 하면 될 것 같긴 하다

  • basicblock 다루기

LLVM의 구조는 Module(비트코드 파일 하나) Function(함수) Basicblock(Instruction의 묶음? 단위), 그 안의 Instruction으로 이루어짐

여기서 Basicblock을 다루는걸 한번 해보기로! 아직 잘 모르지만 해보고 싶은 건 변수 명을 전부 출력하는 걸 해보는걸 목표로 한다

01

Basicblocktest라는 디렉토리를 만들고, lib/Transforms/CMakeList.txt에 Basicblocktest를 추가하고 오류가 없이 실행되는지 테스트하였다.

출력이 안 나오는데… 다음 금요일에 다시 해봐야겠다

This post is licensed under CC BY 4.0 by the author.

Contents