我试图建立与LLVM代码分析工具的简单版本。
我有一个包含某些程序的中间LLVM表示几个.ll文件。
我怎样才能得到的是在程序中的各个功能进行函数调用列表,从LLVM的中间表示?
所述输入参数I具有是LLVM的一个实例:模块类,它表示该程序。 然后,我得到的与功能getFunctionList()存在于程序的功能列表。
void getFunctionCalls(const Module *M)
{
// Iterate functions in program
for (auto curFref = M->getFunctionList().begin(), endFref = M->getFunctionList().end();
curFref != endFref; ++curFref) {
// For each function
// Get list of function calls
}
}
这是我们工作的代码片段在这里 :
for (auto &module : Ctx.getModules()) {
auto &functionList = module->getModule()->getFunctionList();
for (auto &function : functionList) {
for (auto &bb : function) {
for (auto &instruction : bb) {
if (CallInst *callInst = dyn_cast<CallInst>(&instruction)) {
if (Function *calledFunction = callInst->getCalledFunction()) {
if (calledFunction->getName().startswith("llvm.dbg.declare")) {
也请记住,也有调用指令InvokeInst
可以以类似的方式获得。
谷歌CallInst vs InvokeInst
也了解有或没有调用的函数的功能。 如果一个函数没有调用的函数,这是间接调用。 间接调用出现在LLVM IR当源代码而不是直接调用的函数的,调用一个函数指针。 在C ++中,当一些类通过一个抽象接口(多态性),经营这经常发生。 所以请记住,这是不是100%,总能够跟踪调用的函数,即使你有一个适当的调用指令。
文章来源: How can I get the list of function calls that are performed in each function of a program, from the intermediate representation of LLVM?