지난번 " 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 재설치 고려