#llvm 분석 및 변환 패스
이 프로젝트는 Clang 및 LLVM을 사용하여 C ++ 소스 코드를 분석하고 변환합니다.
Clang은 LLVM의 프론트 엔드이며 C ++를 IR로 컴파일합니다. 중간 표현은 C ++보다 훨씬 간단하여 분석하고 변환하기가 더 쉽습니다.
LLVM에는 IR을 분석하고 변환하는 데 사용할 수있는 다양한 라이브러리가 있습니다. 분석 또는 변환에 대한 지침을 패스라고합니다.
패스의 비디오 데모
Done See BelowDone See BelowLLVM과 Clang은 패스를 컴파일하고 적용해야합니다. LLVM 및 Clang을 구축하려면 CMAKE가 필요합니다.
Clang은 C ++를 바이트 코드로 컴파일하는 데 사용됩니다. LLVM은 분석 패스를 제공하는 데 사용됩니다. StaticCount PASS는 BYETECODE의 모든 명령어를 통해 어떤 유형인지 인쇄합니다. 또한 LLVM을 사용하여 분석이 끝날 때 인쇄하는 Certian 통계를 추적합니다.
이 안내서를 따르기 전에 LLVM을 다운로드하고 구축해야합니다.
이 프로젝트와 가이드는 MacOS를 사용하여 만들어졌습니다.
일부 C 코드에 패스를 적용하려면 다수의 단계가 있어야합니다.
<LLVM_Source_Directory>/lib/Transforms 로 이동하십시오.StaticCount 위에 나열된 디렉토리로 복사하십시오.Transforms 디렉토리 내부에는 여러 디렉토리가 있어야하며 하나의 파일 CMakeLists.txt 만 있어야합니다.CMakeLists.txt 열고 줄 add_subdirectory(StaticCount) 추가하십시오.<LLVM_Build_Directory> 의 루트로 이동하고 cmake --build . 이것은 우리가 방금 추가 한 패스를 포함하여 모든 LLVM을 구축 할 것입니다.HeapTimeTestProgram 디렉토리로 이동하십시오.clang -O0 -emit-llvm -c main.cpp -o bctest.bc 실행합니다. 이것은 clang을 사용하여 llvm이 작동 할 수있는 바이트 코드로 C ++ 파일을 컴파일합니다.opt -load <LLVM_Build_Directory>/lib/llvmstaticcount.dylib -StaticCount -stats< bctest.bc > /dev/null 인쇄 된 스테스트는 LLVM을 사용한 정적 분석의 결과입니다.
참고 - 이것은 패스의 전체 출력이 아닙니다. 위의 명령이 보이도록 감소합니다.
문제? 저에게 연락하십시오.
Clang은 C ++를 바이트 코드로 컴파일하는 데 사용됩니다. LLVM은 분석 패스를 제공하는 데 사용됩니다. DynCount 패스는 BYETECODE의 모든 기본 블록을 통과하고 런타임 라이브러리에 호출을 추가합니다. 라이브러리의 기능은이 이정표에 대한 출력 행위 만 있습니다.
첫 번째 패스는 첫 번째 패스와 마찬가지로 컴파일됩니다. 다음은 테스트 프로그램을 바이트 코드로 컴파일합니다. 그 후 런타임 라이브러리는 바이트 코드로 컴파일됩니다. 이 두 바이트 코드 파일은 LLVM을 사용하여 단일 바이트 코드 파일로 연결됩니다. 이 후에 첫 번째 패스와 달리 패스가 적용됩니다. 그 시점에서는 출력이 없습니다. 이것은 동적 패스이므로 런타임에 결과를 얻을 수 있습니다. 마지막으로 우리는 프로그램을 실행하고 결과를 얻습니다. 여러 기본 블록 유형이 발생할 때마다 출력 행위가 있습니다.
이 안내서를 따르기 전에 LLVM을 다운로드하고 구축해야합니다.
이 프로젝트와 가이드는 MacOS를 사용하여 만들어졌습니다.
C 코드에 패스를 적용하려면 다수의 단계가 있어야합니다.
<LLVM_Source_Directory>/lib/Transforms 로 이동하십시오.DynCount 위에 나열된 디렉토리로 복사하십시오.Transforms 디렉토리 내부에는 여러 디렉토리가 있어야하며 하나의 파일 CMakeLists.txt 만 있어야합니다.CMakeLists.txt 열고 줄 add_subdirectory(DynCount) 추가하십시오.<LLVM_Build_Directory> 의 루트로 이동하고 cmake --build . 이것은 우리가 방금 추가 한 패스를 포함하여 모든 LLVM을 구축 할 것입니다.SmallTestProgram 디렉토리로 이동하십시오.clang -O0 -emit-llvm -c smallProgram.c -o sp.bc 이것은 clang을 사용하여 llvm이 작동 할 수있는 바이트 코드로 c 파일을 컴파일합니다.clang -O0 -emit-llvm -c print -o p.bc 이것은 clang을 사용하여 런타임 라이브러리를 바이트 코드로 컴파일하여 위에서 컴파일 한 프로그램과 연결될 수 있습니다.llvm-link p.bc sp.bc -S -o smallprogramandprint.bc 실행 프로그램과 런타임 라이브러리를 연결합니다.opt -load <LLVM_Build_Directory>/lib/llvmDynCount.dylib -DynCount <smallprogramandprint.bc> instrumentedprogram.bc 이를 통해 프로그램에 통화를 수정하여 링크 된 런타임 라이브러리를 수정합니다.lli instrumentedprogram.bc 실행 패스 결과를 볼 수 있도록 계측 프로그램을 실행합니다. 
참고 - 이것은 패스의 전체 출력이 아닙니다. 위의 명령이 보이도록 감소합니다.
문제? 저에게 연락하십시오.