我想在LLVM字节码中找到简单的循环,并提取循环的基本信息.
例如:
for (i=0; i<1000; i++)
sum += i;
Run Code Online (Sandbox Code Playgroud)
我想提取绑定[0,1000],循环变量"i"和循环体(sum + = i).
我该怎么办?
我阅读了LLVM API文档,并找到了一些有用的类,如"Loop","LoopInfo".
但我不知道如何详细使用它们.
你能帮我个忙吗?详细用法可能更有帮助.
如果您不想使用传递管理器,则可能需要在IR中的每个函数上调用llvm :: LoopInfoBase类中的Analyze方法(假设您使用的是LLVM-3.4).但是,Analyze方法将每个函数的DominatorTree作为输入,您必须首先生成它.以下代码是我使用LLVM-3.4测试的(假设您已读取IR文件并将其转换为名为模块的模块*):
for(llvm::Module::iterator func = module->begin(), y=module->end(); func!=y; func++){
//get the dominatortree of the current function
llvm::DominatorTree* DT = new llvm::DominatorTree();
DT->DT->recalculate(*func);
//generate the LoopInfoBase for the current function
llvm::LoopInfoBase<llvm::BasicBlock, llvm::Loop>* KLoop = new llvm::LoopInfoBase<llvm::BasicBlock, llvm::Loop>();
KLoop->releaseMemory();
KLoop->Analyze(DT->getBase());
}
Run Code Online (Sandbox Code Playgroud)
基本上,通过生成KLoop,您可以获得IR级别的各种LOOP信息.您可以在LoopInfoBase类中引用API以获取详细信息.顺便说一下,您可能想要添加以下标题: "llvm/Analysis/LoopInfo.h""llvm/Analysis/Dominators.h".
| 归档时间: |
|
| 查看次数: |
2404 次 |
| 最近记录: |