1 분 소요

실습 1

[실습 1]에서는 clang, llvm-as, llvm-dis, llc 등의 툴을 사용하여 소스 코드 (*.c)IR 코드 (*.bc, *.ll)로 이를 다시 바이너리 코드로 컴파일 하는 방법을 익힌다.

  • clang: LLVM IR 기반 컴파일러로 C,C++ 등 다양한 프론트 엔드를 지원함
  • llvm-as, llvm-dis: IR 레벨의 Assembler와 Disassembler로 이를 이용하여 human-readable assembly 포맷과 bitcode 포멧의 IR을 각각 다른 문법으로 바꿀 수 있음.
  • llc: LLVM backend compile로 bitcode 포맷의 LLVM IR을 머신 어셈블리로 변환함.

예제

#include <stdio.h>  
int main(void)
{
    printf("Hello World\n");
    return 0;
}

목표: 위의 HelloWorld.c 소스코드를 HelloWorld.bc, HelloWorld.ll 형석의 IR코드로 컴파일하기.

1. $ clang HelloWorld.c -o HelloWorld (HelloWorld 파일 생성)  
2. $ clang -emit-llvm -S HelloWorld.c -o (HelloWorld.ll 파일 생성)  
3. $ clang -emit-llvm -c HelloWorld.c -o (HelloWorld.bc 파일 생성)  
LLVM IR 포맷 변경하기  
4. $ llvm-as HelloWorld.ll -o = HelloWorld.2.bc (readable -> bitcode)  
5. $ llvm-dis HelloWorld.bc -o = HelloWorld.2.ll (bitcode -> readable)  
6. $ vimdiff HelloWorld.ll HelloWorld2.ll (두 파일을 비교하면 동일함을 알 수 있다.)  
LLC를 사용하여 IR을 타겟 머신의 바이너리(어셈블리)로 컴파일하기  
7. $ llc HelloWorld.ll -o HelloWorld.s (HelloWorld.s 파일 생성)  
8. $ clang HelloWorld.ll -o HelloWorld (IR코드에서 binary코드로 컴파일 실시)  
ReadIR.cpp (IR을 읽어 모듈 이름을 출력하는 코드) 컴파일하기  
9. $ clang++ ReadIR.cpp -o ReadIR $(llvm-config --cxxflags --ldflags --system-libs --libs mcjit irreader)  
10. $ ./ReadIR HelloWorld.ll (HelloWorld.ll을 컴파일러 프로그램(ReadIR)에서 로드)  
11. $ ./ReadIR HelloWorld.bc (HelloWorld.bc를 컴파일러 프로그램(ReadIR)에서 로드)  

실행 결과

image

태그:

카테고리:

업데이트:

댓글남기기