CS

    LLVM IR 비트코드 분석 - malloc(말록)

    malloc.c #include #include int main(){ int arr[4] = {4, 3, 2, 1}; int* ptrArr; // int 타입 사이즈*4 만큼의 메모리를 할당 ptrArr = (int *)malloc(sizeof(int) * 4); } malloc.ll ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @main() #0 { entry: %arr = alloca [4 x i32], align 16 %ptrArr = alloca i32*, align 8 %0 = bitcast [4 x i32]* %arr to i8* call void @llvm.memcpy.p0i8.p0i8.i64(i8* ali..

    LLVM IR 비트코드 분석 - Function(함수)

    func.c #include unsigned add1(unsigned a, unsigned b) { int c; return a + b; } func.ll ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @add1(i32 %a, i32 %b) #0 { entry: %a.addr = alloca i32, align 4 %b.addr = alloca i32, align 4 %c = alloca i32, align 4 store i32 %a, i32* %a.addr, align 4 store i32 %b, i32* %b.addr, align 4 %0 = load i32, i32* %a.addr, align 4 %1 = load ..

    LLVM IR 비트코드 분석 - Array(배열)

    array.c #include int main() { int numArr[] = {1, 2, 3}; int numArr2[3] = {1, 2, 3}; int numArr3[3]; numArr3[0] = 1; numArr3[1] = 2; numArr3[2] = 3; } array.ll ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @main() #0 { entry: %numArr = alloca [3 x i32], align 4 %numArr2 = alloca [3 x i32], align 4 %numArr3 = alloca [3 x i32], align 4 %0 = bitcast [3 x i32]* %numArr to i..

    LLVM IR 비트코드 분석 - add(덧셈 연산)

    add.c #include int main() { int a = 1; int b = 2; int sum = a + b; printf("%d", sum); } add.ll %a = alloca i32, align 4 %b = alloca i32, align 4 %sum = alloca i32, align 4 store i32 1, i32* %a, align 4 store i32 2, i32* %b, align 4 %0 = load i32, i32* %a, align 4 %1 = load i32, i32* %b, align 4 %add = add nsw i32 %0, %1 store i32 %add, i32* %sum, align 4 %2 = load i32, i32* %sum, align 4 %call =..

    LLVM IR 비트코드 분석 - Variable(변수)

    var.c #include int global_var = 12; int main(){ int local_var; local_var = 14; return global_var; } var.ll @global_var = dso_local global i32 12, align 4 ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @main() #0 { entry: %retval = alloca i32, align 4 %local_var = alloca i32, align 4 store i32 0, i32* %retval, align 4 %0 = load i32, i32* @global_var, align 4 ret i32 %0 }..

    LLVM Pass Practice

    LLVM Pass Practice

    LLVM Pass를 작성하고 실행시켜보는 연습을 해보자. 1. 함수 이름을 출력하는 Pass 작성하기 for 문으로 함수의 이름을 모두 출력한다. test.c 파일은 다음과 같이 작성했다. 2. Instruction의 개수를 세는 Pass 작성하기 이중 for 문을 활용하여 Function, BasicBlock, Instuction을 확인하며, Instruction 하나당 count 변수를 1씩 증가시킨다. 이렇게 존재하는 모든 Instruction에 대해서 count를 증가시키면서 Instruction의 개수를 셀 수있다. 함수 이름과 instruction 개수를 함께 출력하여 쉽게 확인 가능하도록 한다. *인자로 Module&을 받아서 for문으로 Function을 얻는 것과 Function&을 인자..

    LLVM Skeleton Pass

    LLVM build와 install을 마쳤으니 LLVM Pass를 실행해보자. github에서 skeleton pass를 다운받아 실행시켜보려고 한다. 1. Clone LLVM Skeleton Pass git clone https://github.com/manggoguy/llvm-pass-skeleton.git cd llvm-pass-skeleton (clone한 path) mkdir build 소스코드의 구성을 살펴보자. 하나의 Pass당 .h와 .cpp가 하나씩 구성되어있다. ModulePass를 상속받는 클래스 생성한다. 실질적인 동작 수행은 runOnModule에서 이뤄진다. runOnModule 에서는 모듈의 모든 함수의 이름을 출력한다. 2. Source file 생성 vi test.c tar..

    Window에서 LLVM build & Install 하기

    Oracle VM Virtual Box로 llvm build를 계속 실패하다가 결국 window 환경에서 build하게 되었다. VM에서 실패한 이유는 메모리 부족이라고 추정하고는 있지만, 정확한 이유는 찾지 못했다. 나와 같은 문제로 VM Box로 llvm build를 실패한 사람들을 위해 window 에서 llvm build / install 하는 방법을 공유한다. 1. Download Source 먼저 LLVM Download Page에서 다운받으려는 버전을 확인하고, 해당 버전의 GitHub Release로 이동한다. https://releases.llvm.org/download.html LLVM Download Page If you'd like access to the "latest and gr..