분류 전체보기 (23) 썸네일형 리스트형 24_Python IR에 KLEE 함수 직접 추가해보기 1. Python 코드 #!/usr/bin/env python import numba as nb @nb.jit(nopython=True) def add(num): num += num return num @nb.jit(nopython=True) def mul(num): num *= 2 return num @nb.jit(nopython=True) def main(): num = 10 add_result = add(num) mul_result = mul(num) if __name__ == "__main__": main() 2. .py를 .ll로 변경 numba KleeTest.py --dump-llvm > KleeTest.ll 3. KLEE 함수 삽입 수정 전 --------------------LLVM DU.. 23_IR에 Klee 함수 호출 직접 추가 IR에 KLEE 함수 호출 코드 직접 삽입하는 것이 제대로 작동하지 않는지 확인 1. if문이 있는 코드, if의 조건이 하나만 만족하도록 하여 그때의 테스트 케이스만 생성하는지 확인 #include int get_sign(int x) { if (x == 0) return 0; else if (x < 0) return -1; else return 1; } int main() { int a; get_sign(a); return 0; } ; ModuleID = 'testKlee.c' source_filename = "testKlee.c" target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" target triple = "arm64-apple-macosx13.0... 22 1. C 내부에서 함수의 매개변수만 심볼릭하게 - 에러 없음 * 사용한 코드 #include int addResult; int mulResult; int addNum(int num) { num += num; return num; } int mulNum(int num) { num *= 2; return num; } int main() { int num; addResult = addNum(num); mulResult = mulNum(num); return 0; } 2. IR 직접 수정하여 main에서 num변수만 심볼릭하게 - provably false ; ModuleID = 'test3.c' source_filename = "test3.c" target datalayout = "e-m:o-i64:64-i1.. 20_LLVM IR 최적화를 위해 패스 적용하기 오류 문제가 생겼다.. 똑같은 코드에 저번에 사용했던 패스 그대로 적용했는데 (참고 : https://blueee.tistory.com/14) 코드 내용이 늘어났다. 어떻게 이런 일이 일어날 수 있지? 사용한 python 코드 #!/usr/bin/env python import numba as nb @nb.jit(nopython=True) def main(): sum = 0 for number in [31, 63, 62, 87, 14]: sum += number print("sum:", sum) if __name__ == "__main__": main() opt -passes='instcombine,dce,gvn,dse' -S pythonArray.ll -o testOptimized.ll 해당 패스를 적용하면.. 19_Docker와 KLEE 개념 및 설치 1. Docker란? 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. 컨테이너는 Docker 이미지를 실행한 상태이다. 컨테이너를 생성하면, 이미지의 목적에 맞는 파일이 들어있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립적인 공간이 생성된다. 이미지는 컨테이너를 만드는데 사용되는 read only 템플릿이다. 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 docker 파일을 만든 후 빌드하여 이미지를 만든다. 하나의 이미지로 여러 개의 컨테이너를 만.. 18_LLVM Pass 작성 후 적용하기 (with Z3) 이번 주에는 Z3를 불러와서 사용하는 pass를 작성하여 C코드와 Python코드에 대해 적용해보았다. 1. Z3 설치 및 빌드 git clone https://github.com/Z3Prover/z3.git python scripts/mk_make.py cd build make sudo make install 2. 작성한 Pass Z3Pass.cpp (llvm/lib/Transforms/Z3Pass/Z3Pass.cpp) #include "llvm/Pass.h" #include "llvm/IR/Function.h" #include "llvm/Support/raw_ostream.h" #include "z3++.h" using namespace llvm; namespace { struct Z3Pass : p.. 17_Python IR에 LLVM Pass 적용하기 1. numba를 사용하여 .py 파일을 .ll 파일로 변경해준다. numba pythonArray.py --dump-llvm pythonArray.ll 2. llvm-as를 사용하여 .ll 파일을 .bc 파일로 변경해준다. sudo llvm-as pythonArray.ll -o result.bc 3. opt를 사용하여 패스를 적용해준다. ../build/bin/opt -load ../build/lib/NamePrinter.dylib -NamePrinter result.bc -o result_out.bc 이때 opt 경로를 지정해서 적용한다. 전에 사용했던 NamePrinter 패스를 적용하여 함수 이름이 출력되는 것을 확인할 수 있다. 16_LLVM 플러그인 적용 오류 해결 저번주에 C코드 파일에 함수 이름을 적용하는 LLVM pass를 적용시키는 것을 시도했다. 하지만 패스가 작성된 cpp 파일을 컴파일하고 링킹하는데에 문제가 있었다. 해당 문제는 다음과 같았다. clang++ -shared -o NamePrinter.dylib NamePrinter.o 이 명령어를 수행했을 때 ld: symbol(s) not found for architecture arm64 clang-16: error: linker command failed with exit code 1 (use -v to see invocation) 라는 문구와 함께 에러가 발생한 것을 볼 수 있다. 내 경우 해결방법은 llvm 프로젝트 안에 내장 패스처럼 해당 패스를 추가해주는 것이다. 1. 다운 받았던 llvm .. 이전 1 2 3 다음