#LLVM分析和转换通行证
该项目使用Clang和LLVM分析和转换C ++源代码。
Clang是LLVM的前端,它将C ++编译为IR。中间表示比C ++更简单,使分析和转换更容易。
LLVM有多种可用于分析和转换IR的库。分析或转换的说明称为通行证。
通行证的视频演示
Done See BelowDone See Below需要LLVM和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将我们的C ++文件编译为LLVM可以使用的字节码。opt -load <LLVM_Build_Directory>/lib/llvmstaticcount.dylib -StaticCount -stats< bctest.bc > /dev/null the Printed Statments是使用LLVM进行静态分析的结果。
注意 - 这不是通行证的完整输出。它减少了,以使上面的命令可见。
麻烦?请与我联系。
Clang用于将C ++编译到字节码LLVM用于暗示分析通过DynCount Pass通过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将我们的c文件编译为LLVM可以使用的字节码。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这将通行证应用于程序中,将bytecode与我们链接到其链接到它的运行时库进行修改。lli instrumentedprogram.bc它运行了仪器程序,以便我们可以看到通行证的结果。 
注意 - 这不是通行证的完整输出。它减少了,以使上面的命令可见。
麻烦?请与我联系。