카테고리 없음

LLVM Pass 따라해보기

snejs 2025. 5. 9. 14:02

지난번 " Ubuntu에서 LLVM 설치 및 빌드하기 "에서 환경변수부터 다시 시작하도록 한다.

 


환경 변수 설정 및 추가 빌드

지난번 환경 변수 설정에서 설정값이 잘못된 것을 확인하고 이를 바꿔줬다.

 

~/.bashrc 파일을 열어 다음 명령어를 추가하고 저장해준다.

export LLVM_BASE_DIR=/root/LLVM/llvm-project
export LLVM_SRC=$LLVM_BASE_DIR/llvm
export LLVM_OBJ=$LLVM_BASE_DIR/build
export LLVM_DIR=$LLVM_BASE_DIR/build   # CMake용
export PATH=$LLVM_OBJ/bin:$PATH

 

 

.bashrc 파일의 변경 사항을 바로 적용하기 위해 터미널에 다음 명령어를 입력한다.

source ~/.bashrc

 

 

정상 적용 확인

 

기존에 clang이 build 되지 않은 것을 확인

추가적으로 clang을 build 하도록 했다.

cmake -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release ../llvm

 

 

기존 cache 파일들 때문에 명령어가 실행 되질 않는다.

 

 

build 디렉토리 내부에 있는 cache 파일들을 제거하고 다시 실행 하면 된다.

rm -rf CMakeCache.txt CMakeFiles

 

 

혹은 build 폴더를 제거하고 다시 cmake를 실행하면 된다.

 

clang build 까지 마쳐주면 build/bin 에 clang 실행 파일들이 생성된 것을 확인 할 수 있다.

ninja clang

 

 

build가 잘 되었는지 확인

llvm-config --version
clang --version

 

 

 


Pass Tutorial

pass tutorial 과정은 다음 링크에서 설명한 과정을 그대로 따라하였다.

https://github.com/Masterwhiece/llvm8-tutorials-jemin

 

GitHub - Masterwhiece/llvm8-tutorials-jemin: llvm8-tutorials-jemin

llvm8-tutorials-jemin. Contribute to Masterwhiece/llvm8-tutorials-jemin development by creating an account on GitHub.

github.com

 

 

Practice 1

 

 

소스코드를 다운받고 설명 내용을 바탕으로 따라하던 도중 구버전의 명령어에 대한 warning이 발생했다.


-NamePrinter 문법은 사용하지 말고,

-passes=name-printer + -load-pass-plugin 방식으로 변경하여 사용할 필요가 있었다.

 

이를 위해 몇가지 다음과 같은 수정이 필요하다.

 

Makefile 수정

# 기존 컴파일 명령어
clang++ -c -fpic -fno-rtti `llvm-config --cppflags` NamePrinter.cpp -o NamePrinter.o

# 수정된 컴파일 명령어
clang++ -fPIC -shared -o NamePrinter.so NamePrinter.cpp `llvm-config --cxxflags --ldflags --system-libs --libs all`
# 수정된 Makefile.common

ifneq ($(LIBRARY),)
EXTRA_FLAGS=-fPIC
endif

OBJECTS=$(SOURCES:.cpp=.o)

.PHONY: all

all: $(LIBRARY) $(EXECUTABLE)

$(LIBRARY): $(OBJECTS)
	clang++ -shared -o $@ $^ `llvm-config --cxxflags --ldflags --system-libs --libs all`

$(EXECUTABLE): $(OBJECTS)
	clang++ $^ -o $@ `llvm-config --ldflags --libs --system-libs`

%.o: %.cpp
	clang++ -c $(EXTRA_FLAGS) `llvm-config --cppflags` $< -o $@

.PHONY: clean

clean:
	rm -f $(LIBRARY) $(EXECUTABLE) $(OBJECTS)

 

명령어 수정

# 수정된 코드
make clean && make
clang -c -emit-llvm test.c -o test.bc
opt -load-pass-plugin ./NamePrinter.so -passes=name-printer test.bc -o test.opt.bc

 

NamePrinter.cpp 수정

 

몇몇 코드의 수정을 반복하여도 여전히 구 버전의 코드를 사용한다는 사유로 제대로 실행되지 않아 여러번 코드를 수정하는 것을 반복하였다.

 

 

 

CMake 로 시도

 

동일한 사유로 실패

해석 : LLVM Pass를 동적 로딩(-load-pass-plugin)할 때 동일한 옵션이 중복 등록돼 충돌할 경우 발생

 

llvm-project 재설치 고려