LLVM IRの場合、Loop APIを見ると、getStartLocのような関連するコールがあります。今ここであなたはそれがループの種類を識別することができ、ソースコードの行から
llvm::SmallVector<llvm::Loop *> workList;
auto &LI = getAnalysis<llvm::LoopInfoWrapperPass>(CurFunc).getLoopInfo();
std::for_each(LI.begin(), LI.end(), [&workList](llvm::Loop *e) { workList.push_back(e); });
for(auto *e : workList) {
auto line = e->getStartLoc().getLine();
auto *scope = llvm::dyn_cast<llvm::DIScope>(e->getStartLoc().getScope());
auto filename = scope->getFilename();
// do stuff here
}
:だから、この(例えばllvm::Function
パスのrunOn
メソッド内)のような何かを行うことができます。
LoopInfo&LoopInfo = getAnalysis(* F).getLoopInfo(); –
whileループと等価なfor-loopは、全く同じLLVMコードを生成するため、LLVMレベルで区別することはできません。 – sepp2k
@ sepp2kありがとうございました –