컴파일러의 각 단계

image

LLVM Pass란?

  • 프로그램을 변환(Transformation)과 최적화(Optimization)을 수행하거나, 프로그램을 분석하는 LLVM의 프레임워크

  • 위의 그림에서 컴파일러 후반부(Back End)의 Code optmization(코드 최적화), Code generation(코드 생성) 부분의 역할을 LLVM Pass로 수행할 수 있음
  • 이 단계에서 자신이 원하는 코드를 프로그램에 임의로 삽입하거나, 변환시킬 수 있음
  • 프로그램을 중간코드까지 변환한 이후에 수행이 됨
  • 프로그램에 대한 분석도 가능
  • 단, target code 생성은 불가능함

LLVM Pass 시작하기

  • github에서 LLVM skeleton pass를 검색하여, clone해보자
    git clone https://github.com/manggoguy/llvm-pass-skeleton.git

  • Build 방법 및 사용법은 https://github.com/manggoguy/llvm-pass-skeleton.git 링크 참조
  • IDE는 Visual Studio Code 추천

LLVM Pass 빌드하는 방법

1) git clone "repo"
2) cd "clone한 path"
3) mkdir build
4) cmake ../
5) cmake --build .

LLVM Pass 사용하는 방법

1) target이 될 source file을 준비
2) clang -emit-llvm -c "source_file.c"
3) opt -load="abs_path_of_llvm_pass_lib.so" -skeleton source.bc -o out.bc

소스코드 구성

  • 다른 c++ 프로젝트처럼 하나의 Pass당 .h와 .cpp가 하나씩 구성
  • ModulePass를 상속받는 클래스 생성
  • skeleton.h의 static char ID; SkeletonPass() : ModulePass(ID) {} 이 부분은 형식상(?) 필요
  • 실질적인 동작 수행은 runOnModule에서 이루어짐
  • header 파일은 필요한 만큼만 추가하면 됨

Pass 등록

Pass를 사용하기 위해 Pass를 등록(?)하기 위한 코드 (반드시 있어야 함)


LLVM Pass 빌드를 실제로 해보았다. cmake
cmake --build
cmake --build  (2)
위처럼 cmake --build .에서 에러가 났다.
전에 했을 때는 잘 됐었는데, 코드를 다시 다운 받아서 해봐야겠다.

일단 그냥 LLVM Pass로 컴파일을 진행해보았다.
.c에서 .bc를 만들어내는 명령어, .bc에서 .ll을 만들어내는 명령어를 차례로 입력해본 모습이다.
compile

compile result
컴파일은 잘 되었고, .bc, .ll 파일은 잘 만들어졌다. 하지만 Pass가 잘 작동했는지는 모르겠다.