2017-11-06 1 views
0

LLVM IRでwhileループを識別したいと思っています。私はloopInfoを取得するためにLoopInfoWrapperPassを使用しています。while、for、do-whileのような、LLVM IRの異なるループタイプを特定する方法は?

LoopInfo & LoopInfo = getAnalysis(* F).getLoopInfo();

さまざまなループタイプを区別する関連APIはありません。

+0

LoopInfo&LoopInfo = getAnalysis (* F).getLoopInfo(); –

+1

whileループと等価なfor-loopは、全く同じLLVMコードを生成するため、LLVMレベルで区別することはできません。 – sepp2k

+0

@ sepp2kありがとうございました –

答えて

0

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メソッド内)のような何かを行うことができます。

関連する問題